leetcode-447回旋镖问题的python解法

题目描述

给定平面上 n 对不同的点,“回旋镖” 是由点表示的元组 (i, j, k) ,其中 i 和 j 之间的距离和 i 和 k 之间的距离相等(需要考虑元组的顺序)。

找到所有回旋镖的数量。你可以假设 n 最大为 500,所有点的坐标在闭区间 [-10000, 10000] 中。

输入:
[[0,0],[1,0],[2,0]]
输出:
2
解释:
两个回旋镖为 [[1,0],[0,0],[2,0]] 和 [[1,0],[2,0],[0,0]]

刚拿到此问题完全没有头绪不知道该如何解答,参考了很多有智慧的前辈的方法后,总结出此题的解法。

首先如果我们用暴力方法求解,依次循环所有的元素,时间复杂度为O(n^3)这是一个不能接受的复杂度,接下来给出我的思路:


447.PNG

图中可以清晰的看出,我们可以将与point i 这一点的距离和点的个数存储到一个字典中,字典中的key为距离,而value为个数
现在问题基本迎刃而解,因为距离10的元素有1个,这并不符合我们的要求,我们需要的value大于等于2,也就是元素至少为2
下面是该题的python解法

class Solution(object):
    def numberOfBoomerangs(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        res = 0
        # 距离查找表
        order_map = dict()
        #遍历第一次
        for i in range(len(points)):
            order_map.clear()
            #遍历第二次
            for j in range(len(points)):
                if j != i:
                    dist = self.__dis(points[i],points[j])
                    if dist not in order_map:
                        order_map[dist] = 1
                    else:
                        order_map[dist] += 1
            for key,value in order_map.items():
                if value >= 2:
                    res += value * (value-1)
        return res
    #这里开根号也许会丢失精度,不开根号是一样的
    def __dis(self,pa,pb):
        return (pa[0]-pb[0])*(pa[0]-pb[0])+(pa[1]-pb[1])*(pa[1]-pb[1])
447.PNG
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容