evaluate-reverse-polish-notation

牛客网LeetCode部分:

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

2d平面上有n个点,求同在一条直线上的点的最大数量

思路

俩点确定一条直线,先确定起始点,然后遍历剩下的n-1个点,最大可以构成n-1条直线,这n-1条直线中斜率相同的直线属于同一条直线,即该条直线上的点数加1,如果剩下的n-1个点中有与其实点坐标相同的点,那么所有点都加1;改变起始点直到所有的点都遍历完毕
1.第一重循环遍历起始点
2.第二重循环构建直线,并保存每条直线的斜率,考虑斜率为无穷大以及第二个点与起始点坐标相同的情况
3.对斜率排序,这样相同斜率会相邻
4.统计相同的斜率的个数,并把结果保存在一个数组里,数组中的每一个值都代表一个不同的斜率出现的次数,也就是同一条直线上点的个数
5.增加与起始点相同的点的个数
6.循环
7.返回结果数组的最大值加1,因为要加上起始点本身。
由于float的比较不能直接用==,所以特别定义一个比较函数

代码

    bool equa(float num1, float num2)
    {
        float sum = num1 - num2;
        if(sum < 0.00000001 && sum > -0.00000001)
            return true;
        else
            return false;
    }
    int maxPoints(vector<Point> &points)
    {
        int length = points.size();
        vector<float> gradient;
        vector<int> line(1, 0);
        int indexLine = 0;
        int count = 0;
        for(int i = 0; i < length; ++i)
        {
            for(int j = i + 1; j < length; ++j)
            {
                float newgradient = 0.0;
                if((points[i].x - points[j].x) != 0)
                newgradient = (float)(points[i].y - points[j].y) / (float)(points[i].x - points[j].x);
                else if((points[i].y - points[j].y) == 0)
                {
                    ++count;
                    continue;
                }
                else
                newgradient = 65535.0;

                gradient.push_back(newgradient);
            }
            sort(gradient.begin(), gradient.end());
//             for(vector<float>::iterator it = gradient.begin(); it != gradient.end(); ++it)
//            {
//                cout << *it << "   ";
//            }
//            cout << endl;
            vector<float>::iterator beginIt = gradient.begin();
            for(vector<float>::iterator it = gradient.begin(); it != gradient.end(); ++it)
            {
                if(equa(*beginIt, *it))
                    ++line[indexLine];
                else
                {
                    line.push_back(1);
                    line[indexLine] += count;
                    ++indexLine;
                    beginIt = it;
                }
            }

//        for(vector<int>::iterator it = line.begin(); it != line.end(); ++it)
//            cout << *it << "\t";
//        cout << endl;

            line[indexLine] += count;
//            cout << line[indexLine] << endl;
            line.push_back(0);
            ++indexLine;
            count = 0;

            gradient.clear();
        }

        sort(line.begin(), line.end());
        if(length < 1)
            return 0;
        return *(line.end() - 1) + 1;
    }

猜你喜欢

转载自blog.csdn.net/wzc2608/article/details/79896994