Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i,
j, k)
such that the distance between i
and j
equals
the distance between i
and k
(the
order of the tuple matters).
Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).
Example:
Input: [[0,0],[1,0],[2,0]] Output: 2 Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]public class Solution { public int numberOfBoomerangs(int[][] points) { int n = points.length; if(n==0) return 0; int count = 0; for(int i=0;i<n;i++){ Map<Integer,Integer> map = new HashMap<Integer,Integer>(); for(int j=0;j<n;j++){ if(map.containsKey(distance(points[i],points[j]))){ //如果两点之间距离在map里存在,说明有相同的 int value = map.get(distance(points[i],points[j])); //计算效果相当于:若有n个点距离相同,则boomerangs的个数为n*(n-1) count+=2*value; map.put(distance(points[i],points[j]),value+1); } //此时不必再考虑i==j的情况,因为在一次循环中只出现一次,不在if语句中出现,所以并不会影响结果 else { map.put(distance(points[i],points[j]),1); } } } return count; } //只计算两者之间距离的平方即可,若再计算平方根,又加大了计算复杂度 public int distance(int[] a, int [] b){ return (a[0]-b[0])*(a[0]-b[0]) + (a[1]-b[1])*(a[1]-b[1]); } }