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

  • 相关阅读:
    ios常见面试题
    UIButton 头文件常见属性和方法
    UILabel头文件常见属性
    UIButton 文档翻译(持续更新)
    UITextView
    iOS国际化
    55分钟学会正则表达式
    提示框的使用UIAlertController(UIAlertView和UIActionSheet二合一,包含通知中心的使用)
    macbook恢复Finder消失的个人收藏:桌面、文稿、下载、图片
    Socket
  • 原文地址:https://www.cnblogs.com/bonelee/p/8688676.html
Copyright © 2011-2022 走看看