Given n points in the plane that are all pairwise distinct, a "boomerang" is a tuple of points (i, j, k)
such that the distance between i
and j
equals the distance between i
and k
(the order of the tuple matters).
Find the number of boomerangs. You may assume that n will be at most 500 and coordinates of points are all in the range [-10000, 10000] (inclusive).
Example:
Input: [[0,0],[1,0],[2,0]] Output: 2 Explanation: The two boomerangs are [[1,0],[0,0],[2,0]] and [[1,0],[2,0],[0,0]]
class Solution: def numberOfBoomerangs(self, points): """ :type points: List[List[int]] :rtype: int """ # (i, j, k) bruteforce? # for each point, calculate the distance to other points O(n^2) # A(n, 2) def calc_dist(x, y): return (x[0]-y[0])**2 + (x[1]-y[1])**2 ans = 0 for i in xrange(0, len(points)): same_dist_points = {} for j in xrange(0, len(points)): if i != j: dist = calc_dist(points[i], points[j]) if dist not in same_dist_points: same_dist_points[dist] = 0 same_dist_points[dist] += 1 for dist in same_dist_points: if same_dist_points[dist] >= 2: ans += same_dist_points[dist]*(same_dist_points[dist]-1) return ans
精简代码:
class Solution: def numberOfBoomerangs(self, points): """ :type points: List[List[int]] :rtype: int """ # (i, j, k) bruteforce? # for each point, calculate the distance to other points O(n^2) # A(n, 2) nums = 0 for x1, y1 in points: distance = collections.defaultdict(int) for x2, y2 in points: dx = abs(x2 - x1) dy = abs(y2 - y1) d = dx * dx + dy * dy distance[d] += 1 nums += sum(n * (n-1) for n in distance.values()) return nums
关于defaultdict的用法:
>>> import collections
>>> a=collections.defaultdict(int)
>>> a
defaultdict(<type 'int'>, {})
>>> a[1]
0
>>> a
defaultdict(<type 'int'>, {1: 0})
>>> a[2]
0
>>> a
defaultdict(<type 'int'>, {1: 0, 2: 0})
>>> a[2]+=1
>>> a
defaultdict(<type 'int'>, {1: 0, 2: 1})