终于在LeetCode上ac,呜呜呜暴风哭泣
这个题目就是传说中看起来很简单,实际上会因为自己逻辑的漏洞错很多的题目。由于直接求斜率有可能因为double精度的问题判断出现错误。在别人的启发下,用乘法就可以很好的解决这个问题,不用因为double精度的问题导致判断错误。但是由于乘法,有些用例会导致溢出,所以要将之变成long型。
这里的特殊情况就只有重合点的问题了,因为变成乘法不用考虑除数为0的问题了。与初始点重合的选取的第二个点一定要进行保存,不然就会导致丢失前面的点。
class Solution {
public int maxPoints(int[][] points) {
int count = points.length;
int max = 0;
int tmp = 0;
int dup = 0;
for (int i = 0; i < count; i++) {
tmp = 1;
dup = 0;
for(int j=i+1;j<count;j++){
if(points[i][0] == points[j][0] && points[i][1] == points[j][1]){
dup++;
continue;
}
tmp++;
long k2y =(long)(points[j][1]-points[i][1]);
long k2x =(long) (points[j][0]-points[i][0]);
for(int k=j+1;k<count;k++){
if(((points[k][0] == points[j][0] && points[k][1] == points[j][1]))||((points[k][0] == points[i][0] && points[k][1] == points[i][1]))){
tmp++;
continue;
}
else{
long k1y = points[k][1]-points[j][1];
long k1x = points[k][0]-points[j][0];
if(k2y*k1x == k1y*k2x){
tmp++;
}
}
}
if(max<tmp+dup){
max = tmp+dup;
}
tmp = 1;
}
if(max<tmp+dup){
max = tmp+dup;
}
}
return max;
}
}