[leetcode - 149] 直线上最多的点数 python

题目描述:

[leetcode - 149] 直线上最多的点数 python_第1张图片

解题思路:

遍历每一个点(point1),再遍历每一个点(point2)。

则 point1 和 point2 之间有3种可能性:

1.point1.x != point2.x。则此时可以直接计算斜率k,并将斜率k存入字典n。此时需要注意,为了避免极端情况下(k趋近于0时)两个k被判定为相等,需要引入

from decimal import *

k = (Decimal(y - j)/Decimal(x - i))

,以获得更高精度的k,保证计算结果正确。

2.point1.x == point2.x and point1.y == point2.y。此时有两种可能性,一是point1和point2本就是同一个点,二是point2恰好是与point1坐标相同的重叠点,因此d[‘same’]从0开始变化,当这个条件第二次出现时,说明真的是出现了与point1相同的点,开始计数d[‘same’] = 1……

3.point1.x == point2.x and point1.y != point2.y。此时point2与point1在同一垂线上,有k个点跟point1在同一垂线上,n['NaN']就等于k。

经过上述步骤,可以得到两个字典d和n。

n:记录了point1与各个点相连的可能情况,以及该情况上其余点的个数。

d:记录了与point1重叠的点的个数。

# Definition for a point.
# class Point:
#     def __init__(self, a=0, b=0):
#         self.x = a
#         self.y = b
from decimal import *
class Solution:
    def maxPoints(self, points: List[Point]) -> int:
        if points == []:
            return 0
        if len(points) == 1 or len(points) == 2:
            return len(points)
        res = []
        for point1 in points:
            n = {}
            d = {}
            for point2 in points:
                if point1.x!= point2.x:
                    k = Decimal(point1.y - point2.y)/Decimal(point1.x - point2.x)
                    if k in n:
                        n[k] += 1
                    else:
                        n[k] = 1
                elif point1.y == point2.y:
                    if 'same' in d:
                        d['same'] += 1
                    else:
                        d['same'] = 0
                else:
                    if 'NaN' in n:
                        n['NaN'] += 1
                    else:
                        n['NaN'] = 1
            
            if n != {}:
                res.append(max(n.values()) + d['same'] + 1) 
            else:
                res.append(d['same'] + 1)
                
        return max(res)         

 

你可能感兴趣的:([leetcode - 149] 直线上最多的点数 python)