标签:style blog io color sp for div on log
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
如何判断点在同一条直线上呢?可以这么办。设定一个初始起点,计算剩余点到起始点直线的斜率,如果存在斜率相同的情况,则说明这几个点在同一条直线上。但是,还要考虑斜率不存在和重复点的情况。所以单独记录重复点的个数和斜率为正无穷的情况。最后取最大值应该是怎么个取法呢?应该是取 斜率相同的点数+重复点数 和垂直线的条数+重复的点数 的最大值,这个多想一会应该能明白。为了快速得出斜率值相同的直线条数,在本例中用到了map,只要给定斜率值,就能快速找到对应的关联值,方便快捷,不用自己再去写一层循环了。
说来都有一点惭愧,搞了很长时间终于完成,事后发现原因居然是因为if判断条件中误将==写成了=,真是有点伤怀啊!本来很快就能ac了!
现贴出代码!
1 class Solution { 2 public: 3 int maxPoints(vector<Point> &points) { 4 if(points.size()<=2) 5 return points.size(); 6 int i,j; 7 int coin; 8 int h; 9 int maxsize=-1; 10 double k; 11 for(i=0;i<points.size()-1;i++){ 12 map<double, int > point; 13 map<double ,int >::iterator it; 14 h=0; 15 coin=1;//自己本身也算重复了 因为凡是组成直线,点数都是从2起步! 16 for(j=i+1;j<points.size();j++){ 17 if(points[j].x==points[i].x&&points[j].y==points[i].y){ 18 coin++; 19 continue; 20 } 21 else if(points[j].x==points[i].x){//就是这里刚开始把==弄成了=! 22 h++; 23 continue; 24 } 25 else if(points[j].y==points[i].y){ 26 k=0.0; 27 } 28 else{ 29 k=(double)points[j].y-points[i].y; 30 k/=(double)(points[j].x-points[i].x); 31 } 32 it=point.find(k); 33 if(it==point.end()){ 34 point.insert(map<double ,int>::value_type(k,1)); 35 } 36 else{ 37 point[k]++; 38 } 39 40 } 41 h+=coin;//h必须大于coin 42 for(it=point.begin();it!=point.end();it++){ 43 int temp=it->second+coin; 44 if(temp>maxsize) 45 maxsize=temp; 46 47 } 48 if(h>maxsize) 49 maxsize=h; 50 51 } 52 53 return maxsize; 54 55 56 } 57 };
标签:style blog io color sp for div on log
原文地址:http://www.cnblogs.com/zhoudayang/p/4082016.html