题目
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/number-of-boomerangs
给定平面上 n 对 互不相同 的点 points ,其中 points[i] = [xi, yi] 。回旋镖 是由点 (i, j, k) 表示的元组 ,其中 i 和 j 之间的距离和 i 和 k 之间的欧式距离相等(需要考虑元组的顺序)。
返回平面上所有回旋镖的数量。
示例
示例 1:
输入:points = [[0,0],[1,0],[2,0]]
输出:2
解释:两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]
示例 2:
输入:points = [[1,1],[2,2],[3,3]]
输出:2
示例 3:
输入:points = [[1,1]]
输出:0
思路
- 遍历
points
,将每个点作为顶点,计算其他点到顶点的距离,保存相同距离点的数量在map
中- 遍历每个
map
,若与顶点相同距离的点的个数大于1,则计算组成回旋镖的数量- 一共
num
,其中挑2个出来,有num*(num-1)
个可能map[[点],num]=n 意思是到点举例为num的点有n个,n大于1才行。
代码
// 计算两点距离的平方
const getD = ([a1, a2], [b1, b2]) => (b1 - a1) ** 2 + (b2 - a2) ** 2;
const numberOfBoomerangs = points => {
if (points.length < 3) return 0;
const map = {};
let res = 0;
points.forEach((a, i) => {
// 遍历时,将每个点作为顶点
map[a] = {};
// 再次遍历,得到其余的点到顶点的距离
points.forEach((b, j) => {
// 排除与自身的点
if (i !== j) {
// 计算距离
const d = getD(a, b);
// 将距离保存
map[a][d] = (map[a][d] || 0) + 1;
}
});
// 遍历顶点map
for (const item in map[a]) {
// 与顶点相同距离的点的个数
const num = map[a][item];
// num>1,才能和顶点组成回旋镖
// 一共num,其中挑2个出来,有num*(num-1)个可能
if (num > 1) res += num * (num - 1);
}
});
return res;
};
代码链接: