https://leetcode.com/problems/max-points-on-a-line/
注意,点a, b的斜率和b,c的斜率相同的话,就说明a, b, c在一条线上了。不用再看y = k*x+t中的t值了,只需要看k值就可以了。
另外,可以用hashtable来保存已经出现过的斜率,而且相同的点也要注意。
JAVA的double比较不用担心underflow的问题。
hashmap放在循环外层的话,就不能把相同的点加到已经出现的ratio count上了,所以hashtable在里层,因为这时候hashtable保存的是这个点所有线的ratio,所以,跟这个点相同的点可以直接加上hashtable里面的ratio count上。
另外要注意斜率是正无穷和0的情况。
代码今天实在不想写了。。。见这里吧:http://blog.csdn.net/linhuanmars/article/details/21060933
有空把这道题补上。。。。
下面是C++代码,需要注意的是,如果全是重复的点,那么map是空的,进入不了第二个循环,所以在第二个循环前加一句,更新只有duplicate点的情况。另一种方法是不需要iterator,直接在更新umap[key]的时候更新map内的最大值,或者在。下面用的是:
class Solution {
public:
int maxPoints(vector<Point> &points) {
unordered_map<float, int> umap;
int rst = 0;
for(int i=0; i<points.size(); i++){
umap.clear(); //umap[INT_MIN]=0,也可以解决map是空的情况
int localmax = 0;
int duplicate = 1;
for(int j=0; j<points.size(); j++){
if(j==i) continue;
if(points[i].x==points[j].x && points[i].y==points[j].y){
duplicate++;
continue;
}
float key = (points[j].x==points[i].x)?INT_MAX:
((float)(points[i].y-points[j].y))/(points[i].x-points[j].x);
umap[key]++; //rst = std::max(rst, umap[key])解决map是空的情况
}
rst = std::max(duplicate, rst); //解决map是空的情况
for(unordered_map<float, int>::iterator it=umap.begin(); it!=umap.end(); it++){
if((it->second+duplicate)>rst){
rst = it->second+duplicate;
}
}
}
return rst;
}
};