题目
难度:★★☆☆☆
类型:数组
给定平面上 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]]
解答
为了获得回旋镖的数量,我们需要留意:
1. 回旋镖的含义。回旋镖可以看做一个包含三个点的元组,物理含义是一条等腰三角形顶点的记录(这里的等腰三角形可以是一条线),而且交换底边上的两个端点会产生新的记录;
2. 本题思路。我们需要对所有点进行遍历,用一个字典统计该点与其他点的距离,字典的键是两点欧氏距离的平方,字典的值是该距离出现的次数;
3. 重复问题。如果遇到有两个以上点与当前考察点的距离超过相等(均为val),则需要通过val*(val-1)来计算所有组合的可能性。
编码如下:
class Solution:
def numberOfBoomerangs(self, points):
res = 0
for p1 in points:
# 定义一个距离计数器,用于统计每一个距离出现的次数
dist_dict = {}
for p2 in points:
dist = (p1[0]-p2[0])**2 + (p1[1]-p2[1])**2 # 计算p1和p2点距离的平方
dist_dict[dist] = dist_dict[dist] + 1 if dist in dist_dict else 1 # 更新字典中距离计数器
for val in dist_dict.values(): # 遍历每一个出现的距离
if val >= 2: # 如果出现次数大于等于2
res += val*(val-1) # 那么把当前两两组合的结果加入res中
return res
如有疑问或建议,欢迎评论区留言~