一、问题描述:
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]]
二、解决思路:
针对每个点遍历,找到与它距离相同的若干点的集合,针对集合的size做算术运算即可。 例如与点a距离相同的点有b c d e, 那么此时应该有4*3/2*2=12对boomerangs.
三、代码:
public class Solution {
public double comDis(int[] n1, int[] n2) {
return (n1[0] - n2[0]) * (n1[0] - n2[0]) + (n1[1] - n2[1]) * (n1[1] - n2[1]);
}
public int numberOfBoomerangs(int[][] points) {
int np = points.length;
if (np<3){
return 0;
}
double[] dis = new double[np];
int sum = 0;
int[] base = new int[2];
HashMap<Double, Integer> map = new HashMap<Double, Integer>();
for (int j = 0; j < np; j++) {
base = points[j];
map.clear();
for (int i = 0; i < np; i++) {
dis[i] = comDis(base, points[i]);
if (map.containsKey(dis[i])) {
map.put(dis[i], map.get(dis[i]) + 1);
} else {
map.put(dis[i], 1);
}
}
Iterator it = map.keySet().iterator();
while (it.hasNext()) {
double key = (double) it.next();
int num = map.get(key);
sum += (num) * (num - 1);
}
}
return sum;
}
}