这是 LeetCode 上 2021-9-13 的每日一题:「447. 回旋镖的数量」
1. 题目描述
给定平面上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
2. 解答
- 遍历
points
,将每个点作为顶点,计算其他点到顶点的距离,保存相同距离点的数量在map
中 - 遍历每个
map
,若与顶点相同距离的点的个数大于1,则计算组成回旋镖的数量 - 一共
num
,其中挑2个出来,有num*(num-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;
};
😄最近新创建了个开源仓库,总结 LeetCode 的每日一题,目前已有 C++、JavaScript 语言版本,欢迎大家提供其他语言版本!
🖥️仓库地址:「每日一题系列」