zoukankan      html  css  js  c++  java
  • 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})

  • 相关阅读:
    正则表达式(转)
    Java实现的具有GUI的校园导航系统
    由“哥尼斯堡的‘七桥问题’”引出的并查集问题
    Is It A Red-Black Tree?(判断一棵树是否为红黑二叉树)
    Java IO
    Android ORMLite的使用
    Android SQLite数据库的数据升级与降级
    Android SQLite数据库 SQLiteOpenHelper的操作使用
    SimpleAdapter与baseAdapter的使用语法与区别
    Android五大布局之一绝对布局(AbsoluteLayout)
  • 原文地址:https://www.cnblogs.com/bonelee/p/8688676.html
Copyright © 2011-2022 走看看