zoukankan      html  css  js  c++  java
  • 支线任务六

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

    给出一系列点,求出点的个数最多的那条直线。

    两点确定一条直线,N个点就有N(N-1)/2条直线,相同直线数最多的在这条直线上点数就最多。另一个角度,一个点加一个斜率确定一条直线,相对于同一点dy/dx相同的点必定在同一条直线上。而且对于某一个点,另一个点与它的关系有三种,重合,dy/dx为正无穷,dy/dx为有限值。想明白了这些题目就变得很简单了。

    class Solution {
    public:
        int maxPoints(vector<Point>& points) {
            int n = points.size();
            if(n<3)
                return n;
            int result = 0;
            map<float,int> m;
            for(int i=0;i<n;i++) {
                int duplicate = 1;
                for (int j=i+1; j<n; j++) {
                    if(points[j].x==points[i].x && points[j].y==points[i].y) duplicate++;//计算重合的点
                    else if(points[j].x==points[i].x) m[INT_MAX]++;//斜率为无穷大的点
                    else {
                        float k = (float)(points[j].y-points[i].y)/(points[j].x-points[i].x);
                        m[k]++;
                    }
                }
                result=max(result,duplicate);//如果所有点都重合,map为空
                for(map<float,int>::iterator it=m.begin();it!=m.end();it++)
                    result = max(result,it->second+duplicate);
                m.clear();
            }
            return result;
        }
    };

    运行结果:Runtime: 24 ms

  • 相关阅读:
    HTML
    HTML
    HTML
    HTML
    HTML
    HTML
    HTML
    TOMCAT-IDEA远程debug方法
    调整mysql数据库最大连接数
    win10开机时内存使用率达到99%以上
  • 原文地址:https://www.cnblogs.com/zizhao/p/5041467.html
Copyright © 2011-2022 走看看