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]]这道题要寻找所有到固定点距离相等的点对。那么用两层循环,最外层循环固定中心点,里层循环查找到中心点距离相等的点并计数,这里用hashmap根据距离统计次数即可。按照排列组合的思想,若到中心点距离为d的点共有n个,那么共有A n n-1个组合方式。代码如下:
public class Solution {
public int numberOfBoomerangs(int[][] points) {
HashMap<Integer, Integer> hm = new HashMap<Integer, Integer>();
int count = 0;
for (int i = 0; i < points.length; i++) {
for (int j = 0; j < points.length; j++) {
if (i == j) {
continue;
}
int d = getDistance(points[i], points[j]);
hm.put(d, hm.getOrDefault(d, 0) + 1);
}
for (int val:hm.values()) {
count += val * (val - 1);
}
hm.clear();
}
return count;
}
private int getDistance (int[] point1, int[] point2) {
int a = point1[0] - point2[0];
int b = point1[1] - point2[1];
return a * a + b * b;
}
}