回旋镖的数量-LeetCode
447. 回旋镖数量
🎯 问题描述
描述:
给定平面上 n 个点,其中每个点表示为 points[i] = [xi, yi]。
回旋镖是由三个点组成的元组 (i, j, k),其中 i、j 和 k 是不同的点,且 i 到 j 的距离与 i 到 k 的距离相等。
计算并返回回旋镖的数量。
说明:
- 这是一个枚举中心点 + 哈希表计数的问题
- 核心策略:枚举每个点作为回旋镖的中心点,统计到其他点的距离频次
- 排列计算:对于距离相同的点,使用乘法原理计算排列数
示例:
示例 1:
1 | 输入:points = |
💻 解题思路
思路1:枚举中心点 + 动态计数
核心逻辑
- 枚举中心点:
- 遍历每个点作为回旋镖的中心点
i
- 遍历每个点作为回旋镖的中心点
- 计算距离频次:
- 对于每个中心点,计算它到其他所有点的距离平方
- 使用哈希表统计相同距离的点的个数
- 动态计算排列数:
- 关键技巧:在遍历过程中动态累加结果
- 当发现一个新的点与之前某些点距离相等时,立即计算新增的排列数
代码实现
1 | from collections import defaultdict |
📊 性能分析
- 时间复杂度:
- 外层循环枚举中心点:
- 内层循环枚举其他点:
- 哈希表操作平均时间复杂度:
- 总体时间复杂度为
- 空间复杂度:
- 哈希表最多存储 个不同的距离值
- 空间复杂度为
思考
- 为什么使用距离平方?
- 为了避免浮点数运算和开根号操作
- 只需要比较距离是否相等,不需要具体距离值
- 距离平方相等 ⇔ 距离相等
- 动态计数的巧妙之处:
- 传统方法:先统计完所有距离频次,再用公式 计算
- 本解法:边遍历边累加,每次新增点时直接计算贡献
ans += cnt[d2] * 2的含义:cnt[d2]:之前有多少个点与当前点距离相等* 2:新点可以放在排列的第二位或第三位
- 避免重复计数:
- 通过枚举中心点的方式,每个回旋镖只被计算一次
- 顺序不同的元组被视为不同的回旋镖
- 边界处理:
- 当点数少于3时,无法形成回旋镖
- 哈希表自动处理距离频次统计
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 笺札!






