leetcode149. 直线上最多的点数

本文介绍了一种计算二维平面上多个点中处于同一直线上的最大点数的方法。利用哈希表记录每条直线的斜率,并考虑点的重复情况,最终找出共线点的最大数量。

题目:

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

示例:

在这里插入图片描述

思路:

  • 计算通过定点x的所有直线斜率,用哈希表来记录同一斜率的个数,计算完成后更新最大点数;之后接着计算下一个点。
  • 每次计算通过某一个点的斜率时,只需要与后面的点匹配计算,因为之前的点已经与该点匹配过了。
  • 哈希表的key需要注意,由于斜率可能是浮点,用浮点做键值不稳定,所以我们需要用分数来表示斜率,把分子分母约分到最简形式,然后用字符存储,同时要注意正负号。
  • 对于定点x重复出现的情况,我们额外记录出现的次数,最后加到计数里。

代码:

class Solution(object):
    def maxPoints(self, points):
        """
        :type points: List[List[int]]
        :rtype: int
        """
        if not points:
            return 0

        # 求最大公约数
        def gcd(x, y):
            if y == 0:
                return x
            else:
                return gcd(y, x % y)

        hashK = {}
        maxCount = 1

        for i in range(len(points)):
            extraAdd = 0
            tempMax = 1
            for j in range(i+1, len(points)):

                if points[i][0] == points[j][0] and points[i][1] == points[j][1]:
                    extraAdd += 1
                    continue

                if points[i][0] == points[j][0]:
                    k = "nothing" + str(points[i][0])
                elif points[i][1] == points[j][1]:
                    k = "0" + str(points[i][1])
                else:
                    up = points[j][1] - points[i][1]
                    down = points[j][0] - points[i][0]

                    temp = gcd(up, down)
                    up /= temp
                    down /= temp

                    if up*down < 0:
                        mark = "-"
                    else:
                        mark = "+"
                    k = mark+str(abs(up))+"/"+str(abs(down))

                if str(k) in hashK:
                    hashK[str(k)] += 1
                else:
                    hashK[str(k)] = 1

            for v in hashK.values():
                tempMax = max(tempMax, v+1)
            tempMax += extraAdd

            maxCount = max(maxCount, tempMax)
            hashK.clear()

        return maxCount
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值