前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >LeetCode 149. 直线上最多的点数

LeetCode 149. 直线上最多的点数

作者头像
Michael阿明
发布2020-07-13 15:34:04
8080
发布2020-07-13 15:34:04
举报

1. 题目

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

代码语言:javascript
复制
示例 1:
输入: [[1,1],[2,2],[3,3]]
输出: 3
解释:
^
|
|        o
|     o
|  o  
+------------->
0  1  2  3  4
示例 2:
输入: [[1,1],[3,2],[5,3],[4,1],[2,3],[1,4]]
输出: 4
解释:
^
|
|  o
|     o        o
|        o
|  o        o
+------------------->
0  1  2  3  4  5  6

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/max-points-on-a-line 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

  • 双重循环,外层循环确定一个点 i,内层循环所有的点 j(不同于 i 的)与 i 组成的直线的斜率为 ki 的,其map计数+1
  • 斜率用dx,dy的最简分式表示(避免除法)
  • 时间复杂度O(n2)
代码语言:javascript
复制
class Solution {
public:
    int gcd(int a, int b) //求最大公约数
    {
        int g;
        while(b != 0)
        {
            g = a%b;
            a = b;
            b = g;
        }
        return a;
    }
    int maxPoints(vector<vector<int>>& points) {
        int n = points.size(), maxCount = 2, same = 0, count = 0;
        if (n <= 2) 
            return n;
        map<pair<int, int>, int> m;//最简斜率,<dx, dy>, 计数
        int i, j, dx, dy, g;
        for(i = 0; i < n; ++i)
        {
            m.clear();
            same = 1;//i点自己
            count = 0;
            for(j = 0; j < n; ++j) 
            {
                if(j == i)
                    continue;
                dx = points[i][0] - points[j][0];
                dy = points[i][1] - points[j][1];
                if(dx == 0 && dy == 0) //与i相同的点
                    ++same;
                else 
                {
                    g = gcd(abs(dx), abs(dy));//求最大公约数,参数取正数
                    m[{dx/g, dy/g}]++;//经过i点,斜率一样的点,计数+1
                }
            }
            for(auto p : m)//遍历经过i点的所有直线
                if(p.second > count)//经过i点的所有直线中某个斜率的最多
                    count = p.second;
            if (count+same > maxCount) //最多的点数 count+same 在一条直线上
                maxCount = count + same;
        }
        return maxCount;
    }
};
在这里插入图片描述
在这里插入图片描述
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/10/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 题目
  • 2. 解题
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档