LeetCode:149_Max Points on a line | 寻找一条直线上最多点的数量 | Hard

简介: 题目:Max Points on a line Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 这道题需要稍微转变一下思路,用斜率来实现,试想找在同一条直线上的点,怎么判断在一条直线上,唯一的方式也只有斜率可以完成,我开始没想到,后来看网友的思路才想到的,下面是简单的实现:其中有一点小技巧,利用map来存储具有相同斜率值的的点的数量,简洁高效。

题目:Max Points on a line

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line.

这道题需要稍微转变一下思路,用斜率来实现,试想找在同一条直线上的点,怎么判断在一条直线上,唯一的方式也只有斜率可以完成,我开始没想到,后来看网友的思路才想到的,下面是简单的实现:
其中有一点小技巧,利用map<double, int>来存储具有相同斜率值的的点的数量,简洁高效。

 1 /* 
 2     Definition for a point
 3 */
 4 // struct Point {
 5 //     int x;
 6 //     int y;
 7 //     Point():x(0),y(0) {}
 8 //     Point (int a, int b):x(0), y(0) {}
 9 // };
10 
11 int maxPoints(vector<Point> &points) {
12     if (points.empty())
13         return 0;
14     if (points.size() <= 2) 
15         return points.size();
16 
17     int numPoints = points.size();
18     map<double, int> pmap;    //存储斜率-点数对应值
19     int numMaxPoints = 0;
20 
21     for (int i = 0; i != numPoints - 1; ++i) {
22         int numSamePoints = 0, numVerPoints = 0;  //针对每个点分别做处理
23         
24         pmap.clear();
25         
26         for (int j = i + 1; j != numPoints; ++j) {
27             if(points[i].x != points[j].x) {
28                 double slope = (double)(points[j].y - points[i].y) / (points[j].x - points[i].x);
29                 if (pmap.find(slope) != pmap.end())
30                     ++ pmap[slope];   //具有相同斜率值的点数累加
31                 else 
32                     pmap[slope] = 1;
33             }
34             else if (points[i].y == points[j].y) 
35                 numSamePoints ++;   //重合的点
36             else
37                 numVerPoints ++;    //垂直的点
38 
39         }
40         map<double, int>::iterator it = pmap.begin();
41         for (; it != pmap.end(); ++ it) {
42             if (it->second > numVerPoints)
43                 numVerPoints = it->second;
44         }
45         if (numVerPoints + numSamePoints > numMaxPoints) 
46             numMaxPoints = numVerPoints + numSamePoints;
47     }
48     return numMaxPoints + 1;
49 }

 

目录
相关文章
|
3月前
|
算法 Java 索引
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
LeetCode初级算法题:寻找数组的中心索引+x的平方根+三个数的最大乘积+Leetcode 149:直线上最多的点数 Java详解
37 0
|
5月前
|
算法 Java C语言
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
【经典算法】LeetCode25:K 个一组翻转链表(Java/C/Python3,Hard)
36 1
|
5月前
|
算法 数据挖掘 Python
LeetCode题目25 hard:K个一组翻转链表 【分治策略 Python】
LeetCode题目25 hard:K个一组翻转链表 【分治策略 Python】
|
6月前
[leetcode~数位动态规划] 2719. 统计整数数目 hard
[leetcode~数位动态规划] 2719. 统计整数数目 hard
|
6月前
LeetCode hard也就这么回事
LeetCode hard也就这么回事
|
6月前
LeetCode链表hard 有思路?但写不出来?
LeetCode链表hard 有思路?但写不出来?
|
6月前
|
机器学习/深度学习 索引
字节3面真题,LeetCode上hard难度,极具启发性题解
字节3面真题,LeetCode上hard难度,极具启发性题解
|
6月前
|
算法 vr&ar 图形学
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
☆打卡算法☆LeetCode 149. 直线上最多的点数 算法解析
【LeetCode】149. 直线上最多的点数
【LeetCode】149. 直线上最多的点数
【LeetCode】149. 直线上最多的点数
|
算法
LeetCode 363. Max Sum of Rect No Larger Than K
给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
96 0
LeetCode 363. Max Sum of Rect No Larger Than K