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

    Solution1:(TLE)

    class Solution:
        def numberOfBoomerangs(self, points):
            """
            :type points: List[List[int]]
            :rtype: int
            """
            res = 0
            def compute(x,y):
                return (x[0]-y[0])**2 + (x[1]-y[1])**2
            for i in range(len(points)-2):
                for j in range(i+1,len(points)-1):
                    for k in range(j+1,len(points)):
                        if compute(points[i],points[j]) == compute(points[i],points[k]):
                            res += 2
                        if compute(points[i],points[j]) == compute(points[j],points[k]):
                            res += 2
                        if compute(points[k],points[j]) == compute(points[i],points[k]):
                            res += 2
            return res
    

    Brute force.
    24 / 31 test cases passed.

    Solution2:

    class Solution:
        def numberOfBoomerangs(self, points):
            """
            :type points: List[List[int]]
            :rtype: int
            """
            res = 0
            def compute(x,y):
                return (x[0]-y[0])**2 + (x[1]-y[1])**2
            for i in range(len(points)):
                dic = {}
                for j in range(len(points)):
                    if i==j:
                        continue
                    temp = compute(points[i],points[j])
                    if temp not in dic:
                        dic[temp] = 1
                    else:
                        dic[temp] += 1
                for key,value in dic.items():
                    res += value*(value-1)
            return res
    

    典型的以空间换时间的策略,用一个字典保存每个点到该点的距离,从而将时间复杂度从O(n3)降到了O(n2)。

  • 相关阅读:
    iOS-申请开发证书流程
    iOS-代理
    进程和线程
    iOS单例模式
    Switch语句
    枚举类型
    程序的三种结构
    运算符
    Swift项目开发中的一些必备数据
    Swift开发中常用的一些图片处理方法
  • 原文地址:https://www.cnblogs.com/bernieloveslife/p/10235257.html
Copyright © 2011-2022 走看看