版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ccnuacmhdu/article/details/85146693
时间限制:1秒 空间限制:32768K 热度指数:62942
本题知识点: 穷举 leetcode
题目描述
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
思路
穷举每个点的每个斜率。。
/**
* Definition for a point.
* class Point {
* int x;
* int y;
* Point() { x = 0; y = 0; }
* Point(int a, int b) { x = a; y = b; }
* }
*/
import java.util.*;
public class Solution {
public int maxPoints(Point[] points) {
//暴力计算下,统计出所有的斜率情况,算出每种斜率对应的点数,取最大值
//暴力枚举每个点,其他点要么与该点重合,要么与该点连接的直线斜率不存在,要么与该点连接的斜率存在
//浮点运算可能产生精度误差问题,最好HashMap不要用浮点数作为键
if(points == null){
return 0;
}
if(points.length <= 2){
return points.length;
}
HashMap<String, Integer> map = new HashMap<String, Integer>();
int result = 0;
for(int i = 0; i < points.length; i++){
int repetition = 0;
int kNotExist = 0;
int maxCnt = 1;//初始化为1,因为至少当前的这个点i有一个点啊
for(int j = 0; j < points.length; j++){
if(i != j){
int dx = points[i].x - points[j].x;
int dy = points[i].y - points[j].y;
//1.如果i,j重合
if(dx == 0 && dy == 0){
repetition++;
}else if(dx == 0 && dy != 0){//2.如果i,j连接的直线斜率不存在
if(kNotExist == 0){
kNotExist = 2;
}else{
kNotExist++;
}
maxCnt = Math.max(maxCnt, kNotExist);
}else{//3.斜率存在
int g = gcb(dy, dx);
String k = (dy/g) + "/" + (dx/g);
if(map.get(k) == null){
map.put(k, 2);
}else{
map.put(k, map.get(k)+1);
}
maxCnt = Math.max(maxCnt, map.get(k));
}
}
}
result = Math.max(result, maxCnt+repetition);
map.clear();
}
return result;
}
private int gcb(int a, int b){
return b==0?a:(gcb(b,a%b));
}
}