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

  • 相关阅读:
    C# MVC 自定义ActionResult实现EXCEL下载
    如何让WEBAPI 能够进行跨越访问
    C#进阶系列——WebApi 接口返回值不困惑:返回值类型详解
    sC#进阶系列——WebApi 接口参数不再困惑:传参详解
    mybatis.net insert 返回主键
    [转]MySQL中timestamp数据类型的特点
    [转]java List和数组相互转换方法
    [转]Mybatis foreach 批量操作
    [转]让iframe自适应高度-真正解决
    [转]decorators.xml的用法
  • 原文地址:https://www.cnblogs.com/bonelee/p/8688676.html
Copyright © 2011-2022 走看看