題幹
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
在一個2D平面中,找到點集中在一條直線上最多的有多少個點。
數據結構
* Definition for a point.
* struct Point {
* int x;
* int y;
* Point() : x(0), y(0) {}
* Point(int a, int b) : x(a), y(b) {}
* };
*/
解題思路
這個題比較簡單,主要思想簡單講是找斜率相同的點。具體說就是以一個點爲基準,與其他所有點計算斜率,找到與這點斜率相同的各個點,得到一條直線的最多點。
需要兩層循環:
第一層,遍歷參考點。
第二層,除了參考點外的所有點,與參考點進行斜率的計算,存儲斜率相同的點的數量。
比較每個參考點中最多點數,找到最大的。
參考代碼
class Solution {
public:
int maxPoints(vector<Point> &points) {
if (points.size()<=0)
return 0;//點集爲空
if (points.size()==1)
return 1;//點集中只有一個點
int res=0;//定義好結果
for(int i=0;i<points.size();i++){//i爲當前參考點
int vcnt=0,dup=0,curmax=1;//垂直的一條線的點,重合的點,當前的共線點的最大值
double delta_x=0,delta_y=0,k=0.0;
map<double,int>mp;//哈希表存儲相同斜率的點的數量
for(int j=0;j<points.size();j++){
if (j!=i){
delta_x=points[i].x-points[j].x;
delta_y=points[i].y-points[j].y;
if (delta_x==0&&delta_y==0){//重合點
dup++;
}
else if (delta_x==0){//垂直線上的點
if (vcnt==0)
vcnt=2;
else vcnt++;
curmax=max(vcnt,curmax);
}
else {
k=delta_y/delta_x;
if (mp[k]==0)
mp[k]=2;
else mp[k]++;
curmax=max(mp[k],curmax);
}
}
}
res=max(res,curmax+dup);//重合點要加載結果中
}
return res;
}
};
易錯點
特殊關係
1.兩點在垂直座標軸的線上時,斜率是不存在的。需要單獨考慮。
2.幾個點重合在點集中也是算多個元素的,需要單獨討論。於是標記dup爲是否與參考點重合,以便在算後面斜率相同時加上dup。
初始化位置
1.curmax初始化是在第一層循環初始化的,故每有一個新的i,即新的參考點的時候就會重新初始化curmax。如果在循環外初始化的話,前面一個點的參考點的curmax如果大於後面一個參考點的,而後面又有重合點dup的時候,會得到 res=前一個curmax+後一個dup的結果,這個結果顯然是不對的。
2.哈希表的初始化是在第一層循環之後的,也就是說每個參考點有一個哈希表來存儲。這樣使得都是以參考點爲基準比較,直接用斜率會出現幾組點斜率相同平行但不共線的情況。