https://leetcode-cn.com/problems/max-points-on-a-line/submissions/
写这道题的原因很简单,就是因为答题通过率低,想挑战一下
我的想法很简单,就是一个一个点试,新建一个实体类来表示斜率
表示斜率的实体类
class NodeN {
//使用x,y来表示斜率
int x;
int y;
NodeN(int a, int b) {
if (a == 0) {
x = 0;
y = 1;
} else if (b == 0) {
x = 1;
y = 0;
} else {
if (a < 0) {
a *= -1;
b *= -1;
}
int g = gongyue(a, Math.abs(b));
x = a / g;
y = b / g;
}
}
int gongyue(int a, int b) {
if (a < b) {
int c = a;
a = b;
b = c;
}
int c = a % b;
while (c != 0) {
a = b;
b = c;
c = a % b;
}
return b;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
NodeN nodeN = (NodeN) o;
return x == nodeN.x &&
y == nodeN.y;
}
@Override
public int hashCode() {
return Objects.hash(x, y);
}
}
代码
public int maxPoints(int[][] points) {
if (points.length == 0) {
return 0;
}
int maxV = 0;
for (int i = 0; i < points.length; i++) {
Map<NodeN, Integer> map = new HashMap<>();
int max = 0;
for (int j = 0; j < points.length; j++) {
if (i == j) {
max++;
continue;
}
if (points[j][0] == points[i][0] && points[j][1] == points[i][1]) {
max++;
//和自己在一个位置,那无论怎么划线,都是同一点
continue;
}
NodeN node = new NodeN(points[j][0] - points[i][0], points[j][1] - points[i][1]);
Integer v = map.get(node);
if (v == null) {
map.put(node, 1);
} else {
v++;
map.put(node, v);
}
}
maxV = Math.max(maxV,max);
for (Integer v : map.values()) {
maxV = Math.max(maxV, v + max);
}
}
return maxV;
}
leetcode的一些已经写的觉得有意思的其他题目
https://blog.csdn.net/qq_33321609/article/category/9012437
如果有我没有写博客的其他题目需要讨论,欢迎评论,一起探讨