码迷,mamicode.com
首页 > 其他好文 > 详细

Max Points on a Line

时间:2015-12-13 23:36:00      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

题意:给定n个二维平面上的点,找到某条直线让该直线穿过的点最多,并求出点的个数。

 

我的想法:

固定两个点作为一条直线,然后遍历其他的点看是否在这条直线上,一边遍历一边记录。最后把该直线上的点数和之前的最大点数进行比较,并取较大者。然后取下一条直线进行相同的操作,但要注意重复的情况,不然会超时。

思路很简单,三个循环便可以完成,时间复杂度达到了n^3。

贴上代码:

class Solution {
public:
    int maxPoints(vector<Point>& points)
    {
        int maxNum = 0;
        if(points.size() < 3)return points.size();
        for(int i = 0;i < points.size();i++)
        {
            for(int j = i + 1;j < points.size();j++)
            {
                int temMax = 2;
                while(points[j].x == points[i].x && points[j].y == points[i].y)  //固定的两个点相同,则继续往下取,而且temMax加一
                {
                    j++;
                    if(j == points.size())
                        break;
                    temMax++;
                }
                for(int k = j + 1;k < points.size();k++)
                {
                    if(points[k].x == points[i].x && points[k].y == points[i].y)
                        temMax++;
                    else if(points[k].x == points[j].x  && points[k].y == points[j].y)
                        temMax++;
                    else if(getK(points[i], points[k]) == getK(points[i], points[j]))
                        temMax++;
                }
                if(temMax > maxNum)
                    maxNum = temMax;
            }
        }
        return  maxNum;
    }
private:
    double getK(Point a, Point b)
    {
        if(a.x == b.x)return MAX_INPUT;
        double k;
        k = (double)(a.y - b.y)/(double)(a.x - b.x);
        return k;
    }
};

 

需要注意的地方:

1、提交了之后才发现给的测试用例里面有重复的点,大家记得处理这种情况;

2、处理斜率不存在的情况;

3、点的个数小于3时直接输出

Max Points on a Line

标签:

原文地址:http://www.cnblogs.com/HorribleMe/p/5043640.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!