LeetCode(149) Max Points on a Line
2015-11-09 13:24
323 查看
题目
Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.分析
求解一个二维平面上所有点中,位于同一直线上的最多点数。首先想到的算法就是首先固定两个点求其斜率,然后在从剩余节点中计算该直线中的点,累计,比较、、、该方法时间复杂度要O(n^3),肯定不是最优解。
其实,可以略去一层循环,固定一个点,遍历剩余点,求每个斜率,借助一个map存储每个斜率上的点数,比较得到最大值。
斜率:
任意一条直线都可以表述为 y = ax + b 假设,有两个点(x1,y1), (x2,y2),如果他们都在这条直线上则有 y1 = kx1 +b y2 = kx2 +b 由此可以得到关系,k = (y2-y1)/(x2-x1)。即如果点c和点a的斜率为k, 而点b和点a的斜率也为k,可以知道点c和点b也在一条线上。
注意:
1. points中重复出现的点。 2. int maxNum = 0; 初始化,以防points.size() ==0的情况。 3. mp[INT_MIN] = 0; 保证poins中只有一个结点,还有points中只有重复元素时,mp中没有元素。这两种极端情况。 4. int duplicate = 1; duplicate记录重复点的数量,初始化为1,是因为要把当前的点points[i]加进去。 5. float k = points[i].x == points[j].x ? INT_MAX : (float)(points[j].y - points[i].y)/(points[j].x - points[i].x); 计算斜率,如果直线和y轴平行,就取INT_MAX,否则就取(float)(points[j].y - points[i].y)/(points[j].x - points[i].x)
AC代码
class Solution { public: int maxPoints(vector<Point>& points) { if (points.empty()) return 0; int size = points.size(); if (size < 3) return size; //记录最后在同一直线上的最多点数 int maxNum = 0; //记录每条直线上的点数 map<float, int> line; //固定一点,求其余另外所有点数构成的直线斜率 for (int i = 0; i < size; ++i) { line.clear(); line[INT_MIN] = 0; //记录与当前节点的相同节点数 int common = 1; for (int j = 0; j < size; ++j) { if (j == i) continue; //相同的两个点 else if (points[i].x == points[j].x && points[i].y == points[j].y) { ++common; continue; } else{ float k = (points[i].x == points[j].x) ? INT_MAX : (float)(points[i].y - points[j].y) / (points[i].x - points[j].x); ++line[k]; }//else }//for map<float, int>::iterator iter = line.begin(); for (; iter != line.end(); iter++) { if ((iter->second + common) > maxNum) maxNum = iter->second + common; }//for }//for return maxNum; } };
GitHub测试程序源码
相关文章推荐
- light oj 1354 - IP Checking
- mac git 命令提示
- java记——连接两个字符串
- 关于do.....while(0)的用法
- 课后作业2015.11.9
- asp.net验证码及怎么获取里面的数值(整合)
- RVM 安装&卸载
- mysql命令行如何操作
- hdu 1215 七夕节
- linux下软件包tar.gz, rpm,deb的安装方法
- hdu 1215 七夕节
- gem openssl 出错
- 我的OC练习(四)- NSDate类实践
- 上传控件的‘清空’(兼容ie、火狐)
- Zabbix监控MYSQL模板
- 秒,毫秒,倒计时
- leetcode之Triangle
- Codeforces Round #330 (Div. 1) C. Edo and Magnets 暴力
- CSS优先级的详细解说
- 在android studio 1.4.1中使用opencv