给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k)
,其中 i
和 j
之间的距离和 i
和 k
之间的距离相等(需要考虑元组的顺序)。
找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。
示例:
输入: [[0,0],[1,0],[2,0]] 输出: 2 解释: 两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
https://leetcode-cn.com/problems/number-of-boomerangs/description/
class Solution {
public int numberOfBoomerangs(int[][] points) {
int num = 0;
HashMap<Integer, Integer> map = new HashMap<>();
//遍历每一个点的距离相等的数量
for (int i = 0; i < points.length; i++) {
num += equalsDis(points, i, map);
}
return num;
}
/** 一个点的距离相等的数量 */
public int equalsDis(int[][] points, int i, HashMap<Integer, Integer> map) {
int result = 0;
int x = points[i][0];
int y = points[i][1];
//计算其他点距离i点的距离
for (int j = 0; j < points.length; j++) {
if (i == j) {
continue;
}
int xd = points[j][0] - x;
int yd = points[j][1] - y;
//距离相等
int disSqu = xd * xd + yd * yd;
//数量+1
map.merge(disSqu, 1, (a, b) -> a + b);
}
for (int num : map.values()) {
//根据数量算出组合数An2
if (num != 1) {
result += num * (num - 1);
}
}
map.clear();
return result;
}
}