zoukankan      html  css  js  c++  java
  • LeetCode: Max Points on a Line

    Title:

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

    分析:首先要注意的是,输入数组中可能有重复的点。由于两点确定一条直线,一个很直观的解法是计算每两个点形成的直线,然后把相同的直线合并,最后包含点最多的直线上点的个数就是本题的解。我们知道表示一条直线可以用斜率和y截距两个浮点数(垂直于x轴的直线斜率为无穷大,截距用x截距),同时还需要保存每条直线上的点(避免重复)。听起来就很麻烦,但是基于这个思想有一种简单的实现方式:

    • 以某点O为中心,计算它和其他点的斜率,如果有两个点A、B和O点形成的斜率相等,那么ABO三点是共线的,如果有多个点和O的斜率相等,那么这多个点和O也是共线的,因此我们可以求出包含O的所有直线中点数最多的直线,会得到一个最大共线点数k(O),如果和O点重复的点有n个(除了O本身),那么K(O) = K(O) + n。这一步的计算中,为了提高效率,我们可以用哈希表来保存某个斜率对应的点的数目。
    • 对数组中的每一个点i,按照第一步计算得到每个点最大点数K(i)
    • 从k(i)中选取最大的就是本题的解
    • 注意:为了避免重复计算,以数组中第i个点为中心时,只计算数组中它右边的所有点          
    class Solution {
    public:
        int maxPoints(vector<Point>& points) {
            unordered_map<float,int> m;
            if (points.size() < 1)
                return 0;
            int ret_max = INT_MIN;
            for (int i = 0; i < points.size(); i++){
                int tmp_max = 0;
                m.clear();
                int same = 0;
                for (int j = i+1; j < points.size(); j++){
                    
                    if (points[i].x == points[j].x){
                        if (points[i].y == points[j].y){
                            same++;
                        }
                        else
                            tmp_max = max(++m[INT_MAX],tmp_max);
                    }else{
                        
                            float p = 1.0 * (points[i].y - points[j].y) / (points[i].x - points[j].x);
                            tmp_max = max(tmp_max,++m[p]);
                    }
                }
                ret_max = max(ret_max,tmp_max+1+same);
            }
            return ret_max;
        }
    };
  • 相关阅读:
    史上不全 ——LINQ to SQL语句
    asp.net mvc 5 后台操作
    asp.netmvc 前台基本控件操作
    ef6+asp.net MVC5+bootstrap3
    个人改造方法调用接口文档
    mvc开发过程中遇到的一些小问题修改
    FileUpload1 在部分浏览器中实现多选
    时间字段 输入空值显示为1900-1-1的解决办法,在asp.net 后台处理
    ASP.NET-C#中字符串操作
    保留多行文本框的换行与空格样式,并转义HTML标记的尖括号
  • 原文地址:https://www.cnblogs.com/yxzfscg/p/4534397.html
Copyright © 2011-2022 走看看