leetcode 447. Number of Boomerangs

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})

 

posted @   bonelee  阅读(270)  评论(0编辑  收藏  举报
编辑推荐:
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」
历史上的今天:
2017-04-01 信息检索导论的课件——http://home.ustc.edu.cn/~zhufengx/ir/pdf/
2017-04-01 通过Mesos、Docker和Go,使用300行代码创建一个分布式系统
2017-04-01 varint算法——本质上是牺牲最高位作为标识数据结束位,达到变长编码,说白了就是贪心的分割位
点击右上角即可分享
微信分享提示