题目
给定平面上 **n **对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
解题思路
二维数组,i,j,k 从j到i的距离等于从k到i的距离, distanceJI = distanceKI,循环数组,算出其他点到数组项的距离,所以要循环2次数组,计算出距离为d的次数,我用的是Map来保存,temp.set(dis, (temp.get(dis) || 0) + 1),假设距离为d的有m个,回旋镖点的排列是考虑顺序的,从m个点选出2个点,考虑排列顺序,算出总个数,根据排列组合,Am2=m⋅(m−1)
// 算出2点之间的距离, 为避免浮点数计算,不开平方根
var distanceFun = function ([x1, y1], [x2, y2]) {
return Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2);
};
var numberOfBoomerangs = function (points) {
let res = 0;
const n = points.length;
// 遍历数组,
for (let i = 0; i < n; i++) {
let temp = new Map();
const t = points[i];
//再次遍历,算出 2点之间的距离
for (let j = 0; j < n; j++) {
const s = points[j];
const dis = distanceFun(t, s);
temp.set(dis, (temp.get(dis) || 0) + 1);
}
// 算出 总个数
for (let item of temp.values()) {
// if (item >= 2) {
res += item * (item - 1);
// }
}
}
return res;
};
numberOfBoomerangs([
[0, 0],
[1, 0],
[-1, 0],
[0, 1],
[0, -1],
]);