Leetcode 149. Max Points on a Line (python)

题目

在这里插入图片描述

暴力解法:O(n^3)

class Solution:
    def maxPoints(self, points: List[List[int]]) -> int:
        n = len(points)
        if n<=1:
            return n
        
        max_count = 0
        for i in range(n):
            x1,y1 = points[i]
            for j in range(i+1,n):
                x2,y2 = points[j]
                line1 = (y2-y1)/(x2-x1) if x2-x1 else float('inf')
                count = 0
                pair = (points[i],points[j])
                for k in range(n):
                    x3,y3 = points[k]
                    line2 = (y3-y2)/(x3-x2) if x3-x2 else float('inf')
                    if line1 == line2 or points[k] in pair:
                        count += 1
                max_count = max(max_count,count)
        
        return max_count

利用hashmap优化

先把所有可能的斜率算出来,然后再过一遍points即可
这边要注意浮点数的精确计算。上面的解法由于是直接比较斜率,没有牵涉到储存,但是这边有一步斜率的储存,所以直接浮点数储存是不太对的。比如[[0,0],[94911151,94911150],[94911152,94911151]],这个例子用浮点数算的话,1,2两点和1,3两点因为精度的问题算出来会是一样的。所以这边计算斜率的时候用decimal就阔以了。有另外一种思路,不用decimal,而直接用分数表示斜率。只需要判断两个分数斜率的交叉成绩是否相等就可以了,也不用进行约分。比如a/b和c/d,只需判断ad==bc就可以

class Solution:
    def maxPoints(self, points: List[List[int]]) -> int:
        from decimal import Decimal
        n = len(points)
        if n<=1:
            return n
        
        
        slope2pair = {}
        for i in range(n):
            x1,y1 = points[i]
            for j in range(i+1,n):
                x2,y2 = points[j]
                slope = Decimal(y2-y1)/Decimal(x2-x1) if x2-x1 else float('inf')
                count = 0
                pair = (points[i],points[j])
                slope2pair[slope] = pair
                
        
        max_count = 0
        for slope,pair in slope2pair.items():
            x1,y1 = pair[0]
            count = 0
            for point in points:
                x3,y3 = point
                slope_now = Decimal(y3-y1)/Decimal(x3-x1) if x3-x1 else float('inf')
                if point in pair or slope_now == slope:
                    count += 1
            max_count = max(max_count,count)
                
        
        return max_count
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值