LeetCode|LeetCode 447. Number of Boomerangs 回旋镖个数 时间复杂度O(n2)
解题思路
- 因为[i,j,k]三元组中i的位置是唯一的,所以我们可以固定i位对数组points进行遍历。
- 由高中学的排列组合的知识我们得到,以points[i]为i点、距离为l的boomerang的个数等于x*(x-1)(也就是A(x,2)),其中x为与points[i]的距离等于l的点的个数。
- 我们只要把这些x*(x-1)都加起来就能得到题目的答案
- 遍历数组points,将每个元素points[i]设置为[i,j,k]中的i点
- 再次遍历数组points,计算从points[i]到其余点的距离的平方(因为距离的平方与距离是一一对应的关系,这里使用距离的平方以节省计算时间),将这些距离的平方储存在列表list_distance中
- 使用计数器cnt计算list_distance中每个数字出现的次数x
- 将x*(x-1)累计入num_boomerang
欢迎在我的博客轻松探索更多思路
代码
class Solution:
def numberOfBoomerangs(self, points: List[List[int]]) -> int:from collections import Counterif len(points)==1:
return 0num_boomerang=0for i in range(len(points)):
list_distance=[]
for j in range(len(points)):
if j==i:
continue
else:
list_distance.append(pow(points[i][0]-points[j][0],2)+pow(points[i][1]-points[j][1],2))cnt=Counter(list_distance)
for k in cnt:
if cnt[k]>1:
num_boomerang+=cnt[k]*(cnt[k]-1)return int(num_boomerang)
推荐阅读
- LeetCode应该这么刷!
- LeetCode编程题解法汇总|力扣解法汇总590-N 叉树的后序遍历
- LeetCode|LeetCode 42. Trapping Rain Water-五秒内就能理解的O(n)思路
- LeetCode|LeetCode 102. Binary Tree Level Order Traversal
- LeetCode编程题解法汇总|力扣解法汇总599-两个列表的最小索引总和
- [Golang]力扣Leetcode—剑指Offer—数组—53 - II. 0~n-1中缺失的数字(求和、二分法)
- 每日leetcode——42. 接雨水
- [Golang]力扣Leetcode—剑指Offer—数组—53|[Golang]力扣Leetcode—剑指Offer—数组—53 - I. 在排序数组中查找数字 I(哈希表、遍历)
- Leetcode3无重复字符的最长子串(滑动窗口解法)
- Leetcode|leetcode-蜡烛之间的盘子(经典空换时)