[LeetCode] 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.解题思路 若两个点共线,则有如下情况:两个点重合两个点的x坐标相同(斜率无穷大)两个点的斜率相同 y1 = k * x1 + b; y2 = k * x2

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

  • 解题思路
    若两个点共线,则有如下情况:

    • 两个点重合
    • 两个点的x坐标相同(斜率无穷大)
    • 两个点的斜率相同
      y1 = k * x1 + b;
      y2 = k * x2 + b;
      则有k = (y1 - y2) / (x1 - x2);
  • 实现代码

/*****************************************************************
    *  @Author   : 楚兴
    *  @Date     : 2015/2/9 20:46
    *  @Status   : Accepted
    *  @Runtime  : 35 ms
******************************************************************/
#include <vector>
#include <unordered_map>
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) {
        if (points.size() <= 2)
        {
            return points.size();
        }
        int maxNum = 0;
        unordered_map<double,int> mymap;
        int copy;  //重复的点个数
        double k;  //斜率
        for (int i = 0; i < points.size(); i++)
        {
            mymap.clear();
            copy = 0;  //坐标相同点的个数
            for (int j = 0; j < points.size(); j++)
            {
                if (j == i)
                {
                    continue;
                }

                if (points[i].x == points[j].x && points[i].y == points[j].y)
                {
                    copy++;  //相同点
                    continue;
                }

                if (points[i].x == points[j].x)
                {
                    mymap[INT_MAX]++; //斜率不存在
                }
                else 
                {
                    k = (double)(points[i].y - points[j].y) / (points[i].x - points[j].x);
                    mymap[k]++;
                }
            }

            if (mymap.size() == 0)
            {
                maxNum = maxNum > copy ? maxNum : copy;
            }
            int temp;
            for (auto it = mymap.cbegin(); it != mymap.cend(); it++)
            {
                temp = (*it).second + copy;
                maxNum = maxNum > temp ? maxNum : temp;
            }
        }

        return maxNum + 1;  //加上自身
    }
};

int main()
{
    Solution s;
    vector<Point> points;
    Point* p1 = new Point(0, 0);
    Point* p2 = new Point(0, 0);
    points.push_back(*p1);
    points.push_back(*p1);
    cout<<s.maxPoints(points)<<endl;
    delete p1;
    delete p2;
    system("pause");
}
目录
相关文章
|
算法
LeetCode 363. Max Sum of Rect No Larger Than K
给定一个非空二维矩阵 matrix 和一个整数 k,找到这个矩阵内部不大于 k 的最大矩形和。
77 0
LeetCode 363. Max Sum of Rect No Larger Than K
LeetCode 149. Max Points on a Line
给定一个二维平面,平面上有 n 个点,求最多有多少个点在同一条直线上。
81 0
LeetCode 149. Max Points on a Line
LeetCode之Max Consecutive Ones
LeetCode之Max Consecutive Ones
116 0
|
Java Python
LeetCode 485:连续最大1的个数 Max Consecutive Ones(python java)
公众号:爱写bug 给定一个二进制数组, 计算其中最大连续1的个数。 Given a binary array, find the maximum number of consecutive 1s in this array. 示例 1: 输入: [1,1,0,1,1,1] 输出: 3 解释: 开头的两位和最后的三位都是连续1,所以最大连续1的个数是 3. 注意: 输入的数组只包含 0 和1。
827 0
|
Java
[LeetCode]Max Area of Island 岛屿的最大面积
链接:https://leetcode.com/problems/max-area-of-island/description/难度:Easy题目:695.
853 0
|
3天前
|
算法 C++
【刷题】Leetcode 1609.奇偶树
这道题是我目前做过最难的题,虽然没有一遍做出来,但是参考大佬的代码,慢慢啃的感觉的真的很好。刷题继续!!!!!!
9 0
|
3天前
|
算法 索引
【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串
经过这两道题目的书写,相信大家一定深刻认识到了滑动窗口的使用方法!!! 下面请大家继续刷题吧!!!
12 0