【leetcode】149 Max Points on a Line

题目说明

https://leetcode-cn.com/problems/max-points-on-a-line/description/

给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。

解法1

首先遍历点,在第二层循环中使用map记录倾角斜率及其匹配次数。

斜率dx/dy(dx表示两点x轴的距离,dy表示两点y轴的差值)进行计算,但是这里有一种特殊情况,就是dy=0的情况,此种情况下点也在同一直线下,所以需要单独做判断。

还有一种情况就是如果点坐标一致,则不管其他点在什么位置,也需要计入同一直线下,这种情况也需要单独做判断,并且计算总数时需要加上这个点。

/*
 * 时间复杂度:O(n^2)
 * 使用unordered_map保存倾角斜率以及对应的次数
 * 相同的倾角斜率即在同一个直线上
 * 注意:需要加上对相同点的处理
 */
int maxPoints(vector<Point>& points) {
    int res = 0;
    for (int i = 0; i < points.size(); i ++) {
        int samenum = 1;
        int sameynum = 0;
        unordered_map<double, int> map1;
        for (int j = i + 1; j < points.size(); j++)
        {
            //对相同点的判断
            if (points[i].y == points[j].y && points[i].x == points[j].x) {
                samenum ++;
            }
            //对分母相等情况进行判断
            else if (points[i].y != points[j].y){
                //计算倾角
                double a = (double)(points[i].x - points[j].x)/(points[i].y - points[j].y);
                map1[a] ++;
            }
            else{
                sameynum ++;
            }
        }
        //对只有相同点的情况进行处理
        res = max(res,samenum);
        //对y相同点情况作处理,需要加上相同点
        res = max(res,sameynum + samenum);
        //遍历map,取最大值,需要加上相同点
        for (unordered_map<double, int>::iterator iter = map1.begin(); iter != map1.end(); iter ++)
        {
            res = max(res, iter->second + samenum);
        }
    }
    return res;
}

解法2

与第一种解法相比,没有使用dx/dy的方法求斜率,而是使用将dx与dy除以两者的最大公约数,得到化简后的值,比如说6/3、4/2、2/1三者化简后的值是一样的,可视为两点在同一直线上。

/*
 * 时间复杂度:O(n^2)
 * 使用map保存化简后的dx/dy以及对应的次数
 * 相同的dx/dy即在同一个直线上
 * 注意:需要加上对相同点的处理
 *      最大公约数的计算
 */
int maxPoints2(vector<Point>& points) {
    int res = 0;
    for (int i = 0; i < points.size(); i ++) {
        int samenum = 1;//算上本身
        map<pair<int,int>, int> map1;
        for (int j =  i + 1; j < points.size(); j++)
        {
            //对相同点的判断
            if (points[i].y == points[j].y && points[i].x == points[j].x) {
                samenum ++;
            }
            else{
                map1[getpair(points[i], points[j])] ++;
            }
        }
        //对只有相同点的情况进行处理
        res = max(res,samenum);
        //遍历map,取最大值,需要加上相同点
        for (map<pair<int,int>, int>::iterator iter = map1.begin(); iter != map1.end(); iter ++)
        {
            res = max(res, iter->second + samenum);
        }
    }
    return res;
}

//求化简后的dx/dy
pair<int,int> getpair(Point a, Point b)
{
    int dx = a.x - b.x;
    int dy = a.y - b.y;

    //对x或y相等的判断
    if (dx == 0)
        return make_pair(0,1);
    if (dy == 0)
        return make_pair(1,0);

    int gcd = getgcd(dx, dy);
    dx /= gcd;
    dy /= gcd;

    return make_pair(dx, dy);
}
//求最大公约数
int getgcd(int a, int b){ return a == 0 ? b : getgcd(b % a, a); }

原文地址:https://www.cnblogs.com/JesseTsou/p/9536903.html

时间: 2024-10-08 16:05:08

【leetcode】149 Max Points on a Line的相关文章

【leetcode每日一题】149.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. 解析:题目要求是给定n个2维的点,求出总共有多少个点在同一条直线上.由数学知识可知,给定三个点a,b,c,如果三个点在一条直线上,则a和b的斜率与c和d的斜率是相同的.用哈希表来做,针对每个点,求出其余所有点与它的斜率,找出最大值.然后遍历所有的点,返回最大值. 特别需要主意的几点:1)可能存

Java for LeetCode 149 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. 解题思路: 本题主要需要考虑到斜线的情况,可以分别计算出过points[i]直线最多含几个点,然后算出最大即可,由于计算points[i]的时候,前面的点都计算过了,所以不需要把前面的点考虑进去,所以问题可以转化为过points[i]的直线最大点的个数,解题思路是用一个HashMap储存斜率,遍历p

leetcode[149]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. /** * 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 Solutio

【leetcode】363. Max Sum of Rectangle No Larger Than K

题目描述: Given a non-empty 2D matrix matrix and an integer k, find the max sum of a rectangle in the matrix such that its sum is no larger than k. 解题思路: 根据题意,寻找二维数组中所有可以组成的矩形中面积不超过k的最大值,所以必须要求出可能组成的矩形的面积并与k比较求出最终结果.这里为了最终不超时,可以在一下方面进行优化: 1.设置一个数组比较当前列(或

【leetcode】485. Max Consecutive Ones

problem 485. Max Consecutive Ones solution1: class Solution { public: int findMaxConsecutiveOnes(vector<int>& nums) { if(nums.empty()) return 0; int ans = 0, max = INT_MIN; for(int i=0; i<nums.size(); i++) { if(nums[i]==1) ans++; else if(nums

149 Max Points on a Line 直线上最多的点数

给定二维平面上有 n 个点,求最多有多少点在同一条直线上. 详见:https://leetcode.com/problems/max-points-on-a-line/description/ /** * 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 {

149. Max Points on a Line *HARD* 求点集中在一条直线上的最多点数

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. /** * 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 Solutio

149. Max Points on a Line (Array; Greedy)

Given n points on a 2D plane, find the maximum number of points that lie on the same straight line. 思路:对于某一点来说,在经过该点的直线中选取节点数量最多的直线:对于全局来说,必定是某个局部点满足条件的直线之一=>局部最优解也是全局最优解=>贪心法. struct Point { int x; int y; Point() : x(0), y(0) {} Point(int a, int b)

149. 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. 要求是输入n个坐标点,输出最多有多少个点在同一条直线上. 代码提交如下: 1 int Solution::maxPoints(vector<Point>& points) 2 { 3 if (points.size()<=2) 4 { 5 return points.size();