zoukankan      html  css  js  c++  java
  • Lint Code——最多共线的点的个数

    题目链接:http://www.lintcode.com/zh-cn/problem/max-points-on-a-line/#

    条件:给一个点数组

    目标:求出共线的点的最多个数

    实现:时间复杂度——O(n^2)

       要考虑的特殊情况是:①有相同点(这个也太特喵隐蔽了)②斜率不存在的点

    思路:暴力求解,遍历每一个点,与他之后的点进行匹配,用一个map<double,int>存储斜率对应的个数。

    代码:

    /**
     * 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 {
    public:
        /**
         * @param points an array of point
         * @return an integer
         */
        bool check(map<double,int> &res,double k){
            map<double ,int >::iterator it;
            it=res.find(k);
            if(it==res.end()){
                return false;
            }
            return true;
        }
        void change(map<double,int> &res,double k,int &num){
            
            map<double ,int >::iterator it;
            it=res.find(k);
            it->second++;
            if(it->second>num){
                num=it->second;
            }
        }
    
        int maxPoints(vector<Point>& points) {
            // Write your code here
            int num=0;
            if(points.size()==0){
                return num;
            }
            num=1;
            
            Point point_i,point_j;
            double k;
            
            for(int i=0;i<points.size();i++){
                point_i=points[i];
                int same=1;
                map<double,int> res;
                map<double ,int >::iterator it;
                for(int j=i+1;j<points.size();j++){
                    point_j=points[j];
                    if(point_j.x-point_i.x == 0 && point_j.y-point_i.y ==0 ){//同一点
                        same++;
                    }else if(point_j.x-point_i.x == 0 && point_j.y-point_i.y !=0){
                        k=(numeric_limits<double>::max)();
                        if(check(res,k)){
                            it=res.find(k);
                            it->second++;
                        }else {
                            res.insert(pair<double,int>(k,1));
                        }
                    }else if(point_j.x-point_i.x != 0 ){
                        k=(point_j.y-point_i.y)*1.0/(point_j.x-point_i.x);
                        if(check(res,k)){
                            it=res.find(k);
                            it->second++;
                        }else {
                            res.insert(pair<double,int>(k,1));
                        }
                    }
                }
                if(res.empty()){
                    if(same>num){
                        num=same;
                    }
                }
                for(it=res.begin();it!=res.end();it++){
                    if(it->second+same>num){
                        num=it->second+same;
                    }
                }
            }
            return num;
        }
    };
    View Code
  • 相关阅读:
    Html代码查看器
    Http请求
    HTTP协议
    AsyncTask2
    AsyncTask
    幽灵线程解决方案
    handler消息机制入门
    多叉树的树形背包常见建模方法
    Codeforces Round #263
    怎样在win7下装ubuntu(硬盘版安装)
  • 原文地址:https://www.cnblogs.com/sylz/p/6181718.html
Copyright © 2011-2022 走看看