​LeetCode刷题实战149:直线上最多的点数

算法的重要性,我就不多说了吧,想去大厂,就必须要经过基础知识和业务逻辑面试+算法面试。所以,为了提高大家的算法能力,这个公众号后续每天带大家做一道算法题,题目就从LeetCode上面选 !

今天和大家聊的问题叫做 直线上最多的点数,我们先来看题面:

https://leetcode-cn.com/problems/max-points-on-a-line/

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

题意

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

样例

解题

https://blog.csdn.net/qq_17550379/article/details/83035798

这个问题我们有一个最简单的思路,就是我们先从所有点中找出两个点,然后用这两个点构成一条直线,然后再计算有多少点在这个直线上,我们记录它。接着找下一条直线,直到我们计算完所有直线对应的点的个数。这种解法的时间复杂度是O(n^3),显然太慢了,而且实际操作起来也很麻烦。

我们知道一个线段是由斜率和截距决定的,实际上如果我们知道了一个直线上的点和这条直线的斜率也能确定这条直线。基于此,我们可以遍历所以点point,计算其余点和point构成的直线的斜率,如果斜率相同,那么说明两个点在一条直线上,我们只要记录点的个数,最后找到最大值即可。对于上述算法我要注意一个问题,就是存在相同点的情况,我们需要对此加以处理。

from collections import defaultdict
class Solution:
    def maxPoints(self, points):
        """
        :type points: List[Point]
        :rtype: int
        """
        slopes, result = defaultdict(int), 0
        for i, point1 in enumerate(points): 
            slopes.clear()
            duplicate = 1
            for _, point2 in enumerate(points[i+1:]):
                if point1.x == point2.x and point1.y == point2.y:
                    duplicate += 1
                    continue

                slope = float('inf') if point1.x == point2.x else \
                            (point1.y - point2.y)/(point1.x - point2.x)

                slopes[slope] += 1

            if result < duplicate:
                result = duplicate

            for _, val in slopes.items():
                if val + duplicate > result:
                    result = val + duplicate

        return result

好了,今天的文章就到这里,如果觉得有所收获,请顺手点个在看或者转发吧,你们的支持是我最大的动力。

上期推文:

LeetCode1-140题汇总,希望对你有点帮助!

LeetCode刷题实战141:环形链表

LeetCode刷题实战142:环形链表 II

LeetCode刷题实战143:重排链表

LeetCode刷题实战144:二叉树的前序遍历

LeetCode刷题实战145:二叉树的后序遍历

LeetCode刷题实战146:LRU 缓存机制

LeetCode刷题实战147:对链表进行插入排序

LeetCode刷题实战148:排序链表

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值