LC 149. Max Points on a Line
https://leetcode.com/problems/max-points-on-a-line/
基本思路是,按照"斜率+截距"聚合,然后计算每个group下面有多少个点。实现上有两个需要注意的地方:
- 处理重复点
- 计算斜率和截距
我觉得这里的斜率和截距代码可以作为模板使用
- 结果是个4元组 (a, b, c, d)
- b / a 表示斜率
- d / c 表示截距
- 对于垂直线的话表示特殊些,是x轴而非y轴的截距,不过并不会产生混淆
def norm(x, y): m = gcd(x, y) return x // m, y // m def gcd(a, b): while b != 0: a, b = b, a % b return a x = ps[i][0] - ps[j][0] y = ps[i][1] - ps[j][1] if x == 0: ft = (1, 1 << 30, 1, ps[i][0]) elif y == 0: ft = (1, 0, 1, ps[i][1]) else: a, b = slp = norm(x, y) cut = norm(ps[i][1] * a - ps[i][0] * b, b) ft = (slp, cut)