149. 直线上最多的点数
-
[题目链接](149. 直线上最多的点数 - 力扣(LeetCode))
-
解题思路:两个for循环。某一条直线,必须经过第一个点,最多经过多少点?某一条直线,必须经过第二个点,最多经过多少个点?以此类推,最多的那个结果,就是答案。
- 怎么知道必须经过某个点的【直线】,最多经过多少点?例如现在必须经过的点是
(x, y)
,我们只需要计算这个点和其他点的斜率即可。斜率还有一个问题,两个点,横坐标相同时,怎么办?纵坐标相同时,又怎么办?看代码具体处理。 - 还有一个细节,当处理j个点时,不必再看
[0, j - 1]
的点了,为什么?假设最优解是同时经过j与i(i < j
)的直线,我们在计算i的点时,已经计算过,【同时经过i和j】的直线了。
- 怎么知道必须经过某个点的【直线】,最多经过多少点?例如现在必须经过的点是
-
代码
class Solution: class twoPointRelation(): def __init__(self, x, y, same): self.x = x # 斜率的分母 self.y = y # 斜率的分子 self.same = same # 为True,代表分母或者分子为0 分母为0时:x为0,y就是两个点的x轴的值, 分子为0时:y为0,x就是两个点y轴的值 # 下面这两个函数是为了在字典的key def __hash__(self): return hash((self.x, self.y, self.same)) def __eq__(self, other): return self.same == other.same and self.x == other.x and self.y == other.y def gcd(self, a, b): if b == 0: return a return self.gcd(b, a % b) def maxPoints(self, points: List[List[int]]) -> int: # 两个点的关系:斜率k,(y1 - y2) / (x1 - x2) 当x相同时 没有斜率 dict = {} count = len(points) ans = 0 for i in range(count): dict.clear() for j in range(i + 1, count): x1 = points[i][0] y1 = points[i][1] x2 = points[j][0] y2 = points[j][1] first = y2 - y1 # 分子 second = x2 - x1 # 分母 if second == 0: # 分母为0 k = self.twoPointRelation(0, x2, True) elif first == 0: # 分子为0 k = self.twoPointRelation(y1, 0, True) else: num = self.gcd(first, second) k = self.twoPointRelation(second / num, first / num, False) if k in dict: dict[k] += 1 else : dict[k] = 1 ans = max(ans, dict[k]) return ans + 1
标签:
leetcode刷题
, 数据结构与算法
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理