[LeetCode]Max Points on a Line
2014-06-30 05:19
429 查看
Given n points
on a 2D plane, find the maximum number of points that lie on the same straight line.
Analysis:
任意一条直线都可以表述为
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也在一条线上。解法就从这里来
取定一个点(xk,yk), 遍历所有节点(xi, yi), 然后统计斜率相同的点数,并求取最大值即可
Java
on a 2D plane, find the maximum number of points that lie on the same straight line.
Analysis:
任意一条直线都可以表述为
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也在一条线上。解法就从这里来
取定一个点(xk,yk), 遍历所有节点(xi, yi), 然后统计斜率相同的点数,并求取最大值即可
Java
public int maxPoints(Point[] points) { if(points.length<=2) return points.length; int maxNum = 0; int duplicate = 1; HashMap<Float, Integer> slopMap = new HashMap<>(); for(int i = 0;i<points.length;i++){ slopMap.clear(); duplicate = 1; for(int j=0;j<points.length;j++){ if(i==j) continue; if(points[i].x==points[j].x && points[j].y == points[i].y){ duplicate++; continue; } float slop = (points[i].x==points[j].x) ? Integer.MAX_VALUE :(float)(points[j].y-points[i].y)/(points[j].x-points[i].x); if(slopMap.containsKey(slop)){ int temp = slopMap.get(slop); temp++; slopMap.put(slop, temp); }else { slopMap.put(slop, 1); } } if(slopMap.size()<=0) maxNum = duplicate; for (Iterator<Map.Entry<Float, Integer>> iterator = slopMap.entrySet().iterator(); iterator.hasNext();) { Map.Entry<Float, Integer> out= iterator.next(); if(out.getValue()+duplicate>maxNum) maxNum = out.getValue()+duplicate; } } return maxNum; }c++
int maxPoints(vector<Point> &points) { if(points.size()<=2) return points.size(); unordered_map<float, int> statistic; int maxNum = 0; for(int i=0;i<points.size();i++){ statistic.clear(); statistic[INT_MIN] = 0; int duplicate = 1; for(int j=0;j<points.size();j++){ if(j==i) continue; if(points[j].x == points[i].x && points[j].y==points[i].y){ duplicate++; continue; } float slop = (points[j].x == points[i].x) ? INT_MAX: (float)(points[j].y-points[i].y)/(points[j].x-points[i].x); statistic[slop]++; } unordered_map<float, int>::iterator it; for(it = statistic.begin();it!=statistic.end();++it){ if(it->second + duplicate>maxNum) maxNum = it->second + duplicate; } } return maxNum; }
相关文章推荐
- LeetCode:Max Points on a Line (Java)
- 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 & Sort List
- Max Points on a Line(LeetCode)
- LeetCode problem 3: Max Points on a Line
- LeetCode Max Points on a Line
- leetcode-149. Max Points on a Line
- LeetCode——max-points-on-a-line
- [LeetCode] Max Points on a Line, Solution
- Max Points on a Line--LeetCode
- Leetcode: max-points-on-a-line
- Leetcode Max Points on a Line
- LeetCode Max Points on a Line 解题报告
- 【九度】题目1548:平面上的点 && 【LeetCode】Max Points on a Line
- LeetCode-149.Max Points on a Line
- Leetcode_max-points-on-a-line(c++ and python version)
- LeetCode | Max Points on a Line