解题报告1 Max Points on a Line
2016-09-18 22:30
281 查看
题目:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
方法:
找到两个不重合的顶点,然后统计这两个顶点确定的直线上点的数目。
遍历所有的起点和终点即可。
1.确定起点
2.统计平面上多少顶点与起点重合
3.找到一个与起点不重合的顶点作为终点,统计起点与终点确定的直线上所有的与起点不重合的顶点
(注意可以和终点重合,用三点共线即可)
4.将步骤2中顶点数目与步骤3中数目相加即可
代码中
1.for( intj
= i+1; j<size; j++)的解释:
对于顶点points[i],points[j]所确定的直线与points[j],points[i]所确定的直线相同
j=i+1可以避免这种重复计算。
2.判断与起点相同的点的数目与顶点总数目的原因 ,如果所有的点都和起点相同?
或者只有一个顶点和起点不相同,那么并没有三点共线的问题。参考博客里好像没考虑这个问题也对了?
参考:http://www.cnblogs.com/bill-liu/p/5027828.html
代码:
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.
方法:
找到两个不重合的顶点,然后统计这两个顶点确定的直线上点的数目。
遍历所有的起点和终点即可。
1.确定起点
2.统计平面上多少顶点与起点重合
3.找到一个与起点不重合的顶点作为终点,统计起点与终点确定的直线上所有的与起点不重合的顶点
(注意可以和终点重合,用三点共线即可)
4.将步骤2中顶点数目与步骤3中数目相加即可
代码中
1.for( intj
= i+1; j<size; j++)的解释:
对于顶点points[i],points[j]所确定的直线与points[j],points[i]所确定的直线相同
j=i+1可以避免这种重复计算。
2.判断与起点相同的点的数目与顶点总数目的原因 ,如果所有的点都和起点相同?
或者只有一个顶点和起点不相同,那么并没有三点共线的问题。参考博客里好像没考虑这个问题也对了?
参考:http://www.cnblogs.com/bill-liu/p/5027828.html
代码:
/** * 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) { int size = points.size(); if( size<=2 ) return size ; int maxinum = 0 ; int num = 0 ; //(points(i),points(j)) 与 (points(j),points(i)) 确定的是一条直线,避免重复统计 //因此j从i+1开始遍历 for( int i = 0; i<size; i++ ) { int x1,y1 ; x1 = points[i].x ; y1 = points[i].y ; int sameNum = 1 ; for(int j=0; j<size; j++ )//统计与起点相同的点的数目+原起点1 { int x2 = points[j].x , y2 = points[j].y ; if( x2==x1 && y2==y1 && j!=i ) sameNum++; } if( sameNum!=size ) { //j=i+1,避免重复计算 for( int j = i+1; j<size; j++)//选取一个与起点不相同的点作为终点,查找这条直线上点数 { int x2,y2 ; x2 = points[j].x ; y2 = points[j].y ; num = 1 ;//每次遍历一条直线上所有点数后num需要重置,因为points[j]与起点不同所以num=1 if( x2!=x1 || y2!=y1 )//选取一个与起点不相同的点作为终点 { for( int k=0; k<size; k++ )//统计这条直线上点数 { int x3 = points[k].x , y3 = points[k].y ; if( (x3!=x1 || y3!=y1)&&k!=j )//第三个点不能起点重合,终点不需要统计,但重合可以 { if( (y1-y2)*(x1-x3) == (y1-y3)*(x1-x2) )//如果三点共线 num++; } } num = num + sameNum ;//如果sameNum==size-1其实只有两个点 }//统计两点确定直线上所有点数 if( num > maxinum ) maxinum = num ; } } else maxinum = sameNum;//全部与起点相同 } return maxinum ; } };
相关文章推荐
- [LeetCode OJ] Max Points on a Line 解题报告
- LeetCode—Max Points on a Line解题报告
- 【LeetCode】Max Points on a Line 解题报告
- [leetcode] 149. Max Points on a Line 解题报告
- [Leetcode] 149. Max Points on a Line 解题报告
- 解题报告(LeetCode):Max Points on a Line
- Leetcode Max Points on a Line 解题报告
- LeetCode 解题报告 Max Points on a Line
- LeetCode Max Points on a Line 解题报告
- LeetCode: Max Points on a Line 解题报告
- LeetCode Max Points on a Line 解题报告
- 解题报告: LeetCode Max Points on a Line
- 149. Max Points on a Line
- leetcode 日经贴,Cpp code -Max Points on a Line
- #LeetCode Max Points On A Line
- [LeetCode]Max Points on a Line
- (leetcode)Max Points on a Line
- leetcode 第149题 Max Points on a Line
- Max Points on a Line
- LeetCode Max Points on a Line