博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Max Points on a Line
阅读量:5049 次
发布时间:2019-06-12

本文共 1994 字,大约阅读时间需要 6 分钟。



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

大意为:给定二维平面的一组points,从中找出在同一直线上的最多的点的数量并返回

 



最直白最简单的算法是采用遍历法,用两层遍历,先从中选定一个点,再遍历所有的点,找出与其斜率相等的点,然后更新定义的maxNum。最后即得到答案。

大致步骤为:

                1.第一层遍历选中一个点a(x1, y1)

                2.第二层遍历所有的点b(x2,y2),若

                                                            1)x1 = x2且 y1 = y2,将samepoints++(自己声明的变量,表示相同点的个数);

                                                            2)x1 = x2且y1 != y2, 将其斜率置为INT_MAX,并将其对应的点数加一

                                                            3)k = (float)(y1 - y2)/(x1 - x2),将k对应的点数加一

               3.一次循环结束,更新maxNum = MAX((K)对应的点数 + samepoints)

               4.所有循环结束,返回maxNum即可。


/**

 * Definition for a point.
 * struct Point {
 *     int x;
 *     int y;
 *     Point() : x(0), y(0) {}
 *     Point(int a, int b) : x(a), y(b) {}
 * };
 */

//自己声明的一个结构体

 struct element
 {
  float k;
     int kNum;
     element():k(0.0), kNum(0){}
 };
 
class Solution {
public:
    int maxPoints(vector<Point>& points) {
        int maxNum = 0;
        bool IsFind = false;
        
        for(int i= 0; i < points.size(); i++)
        {
            //同位置的点
            int samePoint = 0;  
            //存储元素
            vector<struct element> kVec;
            
            for(int j = 0; j < points.size(); j++)
            {
                //同点
                if(points[i].y == points[j].y && points[i].x == points[j].x)
                {
                    samePoint++;
                }
                //无k
                else if(points[i].x == points[j].x)
                {
                    for(int m = 0; m < kVec.size(); m++)
                    {
                        if(kVec[m].k == INT_MAX)
                        {
                            kVec[m].kNum++;
                            IsFind = true;
                            break;
                        }
                    }
                    if(!IsFind)
                    {
                        struct element el;
                        el.k = INT_MAX;
                        el.kNum = 1;
                        kVec.push_back(el);
                    }
                    else
                    {
                        IsFind = false;
                    }
                }
                
                //正常情况
                else
                {
                    float k = (float)(points[j].y - points[i].y) / (points[j].x - points[i].x);
                    for(int m = 0; m < kVec.size(); m++)
                    {
                        if(kVec[m].k == k)
                        {
                            kVec[m].kNum++;
                            IsFind = true;
                            break;
                        }
                    }
                    if(!IsFind)
                    {
                        struct element el;
                        el.k = k;
                        el.kNum = 1;
                        kVec.push_back(el);
                    }
                    else
                    {
                        IsFind = false;
                    }
                }
            }
            
            if(kVec.empty())
                return samePoint;
            //找最大的
            for(int i = 0; i < kVec.size(); i++)
            {
                if(maxNum < kVec[i].kNum + samePoint)
                {
                    maxNum = kVec[i].kNum + samePoint;
                }
            }
        }
        return maxNum;
    }
};



  1.本题虽然解出来了,但是有一定的局限,即假定了k没有取到INT_MAX(代码中将其作为K为无穷时的斜率)的取值,并且假定k在float的取值范围内。不过在LeetCode平台能通过,那就是满足题目要求。

  2.本题还可以利用c++STL中的map来存储k对应点的个数,即声明一个map<float, int>的变量,详细解答及代码可参见博文

 

转载于:https://www.cnblogs.com/YJthua-china/p/5042293.html

你可能感兴趣的文章
python基础
查看>>
ServletContext对象
查看>>
HTML表格及网页编辑
查看>>
mysql事务
查看>>
[最大环+缩点+BFS]codeforces Round 95 Div2
查看>>
asp.net 获取服务器及客户端的相关信息
查看>>
Python基础01
查看>>
Bit,Byte,WORD,DWORD区别和联系
查看>>
英语中咖啡表示
查看>>
kali更新源
查看>>
The Settlers of Catan
查看>>
Android:JNI与NDK(一)
查看>>
使用BBCP来提升跨互联网的数据传输速度
查看>>
08 Python - Python数值类型
查看>>
34 Python - 正则表达式 Group编组
查看>>
LeetCode: Validate Binary Search Tree
查看>>
160303、js加密跟后台加密对应
查看>>
026_nginx引用lua遇到的坑
查看>>
找出给定字符串中出现最多的字符和次数
查看>>
IPTV中的EPG前端优化
查看>>