149. Max Points on a Line

判断共线也是三点间关系,可以确定两点然后遍历所有第三点来找解,这个有跟3Sum类似的地方,但不同的是这边不是可以按照大小关系排列的array,而是cordinates,只能三点全部都做遍历,时间复杂度近似n**3.

15. 3Sum

本来想通过记录斜率来写个n**2的解法,结果因为python的浮点数问题,某些test case就是过不了,懒得整了.

class Solution:
    def maxPoints(self, points: List[List[int]]) -> int:
        res = 0
        n = len(points)
        if n <= 2: return n
        # 确认第一点
        for i in range(n):
            x1, y1 = points[i]
            repeat = 1
            # 第二点,直接从 i 后面一个开始选起,节约计算
            for j in range(i+1, n):
                x2, y2 = points[j]
                line = 0
                # input里有重合点,需要另算重合点的计数
                if x1 == x2 and y1 == y2: 
                    repeat += 1
                    continue
                # i, j 两点就已经确定一条直线了
                # 确认了直线,第三点就只需要判断是否落在直线上
                for k in range(n):
                    x3, y3 = points[k]
                    if (x1-x3)*(y2-y3) == (x2-x3)*(y1-y3): line += 1
                        
                res = max(line, res)
                
            res = max(repeat, res)
            
        return res

Last updated

Was this helpful?