zoukankan      html  css  js  c++  java
  • [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.

    Hide Tags
     Hash Table Math
     

    给出平面上的点,问一条直线最多穿过几个点.

    要不是之前看过这个题的题解,我感觉可能会一点想法都木有...

    我可能会去,枚举两个点,然后再枚举其他点是否在这个直线上,O(n^3).

    实际上呢,我们只需要枚举一个点,然后再枚举其他点和这个点构成的斜率.

    既然斜率相同,而且过一个点,当然在一个直线上啦.

    然后找出构成的所有的斜率里面点最多的那个就ok啦.

    不过要注意处理的是:

    1,没有点

    2,相同点(题意似乎是算做n个而不是一个)

    3,斜率的话要注意垂直

    4 后面处理的时候不需要计算前面的点,因为前面的点计算在计算相同的斜率的时候已经计算过了。。

    class Solution {
        public:
            int maxPoints(vector<Point>& points) {
    
                if(points.size() == 0)
                    return 0;
                if(points.size() == 1) 
                    return 1;
                if(points.size() == 2)
                    return 2;
    
                int size = points.size();
                map<double, int> hash;
                int duplicateCnt = 0;
                int rtn = 0;
    
                for(int i = 0; i < size; i++)
                {
                    hash.clear();
                    duplicateCnt = 0;
                    //calc the max number for each point
                    for(int j = i + 1; j < size; j++)
                    {
                        if(points[i].x == points[j].x)
                        {
                            if(points[i].y == points[j].y)
                                duplicateCnt++;
                            else
                                hash[double(INT_MIN)]++;
                        }
                        else
                        {
                            double k = ((double)(points[j].y-points[i].y))/(points[j].x-points[i].x);
                            hash[k]++;
                        }
                    }
    
                    if(duplicateCnt >rtn )// incase the hash is empty
                        rtn = duplicateCnt;
                        
                    for(map<double,int>::iterator it = hash.begin(); it != hash.end(); it++)
                    {
                        if(it->second + duplicateCnt > rtn)
                            rtn = it->second + duplicateCnt;
                    }
                }
                return rtn + 1;//remember + 1, including the orginal point
    
            }
    };
  • 相关阅读:
    jmetal随机数
    [转]IDEA断点调试基础
    [转]java指数表示最大数和最小数
    反向学习相对基学习opposition-based learning简介
    IGD反转世代距离-多目标优化评价指标概念及实现
    matlab sum函数
    多目标优化拥挤距离计算
    [转]matlab 中的波浪号
    多目标优化按支配关系分层实现
    Matlab矩阵加入新元素
  • 原文地址:https://www.cnblogs.com/diegodu/p/4600619.html
Copyright © 2011-2022 走看看