149. 直线上最多的点数
给你一个数组 points
,其中 points[i] = [xi, yi]
表示 X-Y 平面上的一个点。求最多有多少个点在同一条直线上。
代码:
class Solution {
public int maxPoints(int[][] points) {
ArrayList<Integer> num1 = new ArrayList<>();
ArrayList<Integer> num;
float x;
float y;
float k = 0;
for(int i = 0; i < points.length; i++) {
ArrayList<Float> ks = new ArrayList<>();
num = new ArrayList<>();
for (int j = i+1; j < points.length; j++){
x = points[j][0] - points[i][0];
y = points[j][1] - points[i][1];
if (x == 0 || y == 0) {
if (y == 0) {
k = 0;
}
if (x == 0) {
k = 9999999;
}
} else {
k = y/x;
// System.out.println(k);
}
if (ks.contains(k)){
num.set(ks.indexOf(k),num.get(ks.indexOf(k)) + 1);
} else {
ks.add(k);
num.add(1);
}
}
int max = 0;
for(int j = 0; j < num.size(); j++){
if (num.get(j) > max) {
max = num.get(j);
}
}
num1.add(max);
// System.out.println(max);
}
int max = 0;
for(int i = 0; i < num1.size(); i++){
if (num1.get(i) > max) {
max = num1.get(i);
}
}
return max + 1;
}
}
思路:
一开始考虑计算两两点之间的斜率看相同斜率的点有几个
提交之后发现思路漏洞 相同斜率并不一定是同一条直线(哈哈哈太有病了高中数学全还给老师了)
比如00、11和34、56就不是同一条直线但斜率相同
更换思路:
计算当前点与后面所有点的两点之间斜率,看有几个点与当前点的斜率是相同,与当前点斜率相同证明这些点在同一条直线
两层循环内层循环计算所有斜率 外层循环记录最大值
最后找出拥有最多斜率相同点的数据再加一(因为还有外层循环的点本身)就是直线上最多点的个数
代码我用了arraylist记录,看起来很笨有点麻烦因为我看到这题第一反应就想起来arraylist后面更换思路了之后也懒得换了 另外找最大值的部分应该也可以优化
时间复杂度O(n^2)
空间复杂度O(n)