算法(40)-直线斜率-C++

原问题: 已知两个数组arrx arry 表示二维平面上的点坐标
              问一条线最多能穿过多少个点?
             其实就是问,同一斜率上的最大点数。可以简单看出一组数据的状态。
斜率计算公式 :d=y1-y2/x1-x2 用double型数据是有精度损耗到溢出。
斜率存储:哈希表或者map表。
                 <string,int>  key表示斜率:"3_5" 3/5 ;
                                     value :表示此斜率的个数。
               返回value的最大值即可。

最大公约数计算:gcb 辗转相除法。
上代码

class Point {
public:
    int x;
    int y;

    Point()
    {
        x = 0;
        y = 0;
    }

    Point(int a, int b) {
        x = a;
        y = b;
    }
};
typedef vector<Point>  vpoint;
//最大公约数
int gcd(int a, int b)
{
    return b == 0 ? a : gcd(b, a % b);
}

//斜率, 1.最大公约数
//精度损耗
int maxPoints(vpoint points)
{
    if (points.size() == 0) {
        return 0;
    }
    if (points.size() <= 2) {
        return points.size();
    }
    //key i斜率,value 个数 
    //比如"3_4"  7
    map<string, int> mymap;//斜率表
    int result = 0;
    for (int i = 0; i < points.size(); i++)
    {
        mymap.clear();
        int samePosition = 1;//1.共位
        int sameX = 0;//2.共竖线
        int sameY = 0;//3.共横线
        int line = 0;
        for (int j = i + 1; j < points.size(); j++)
        {
            if (points[j].x == points[i].x && points[j].y == points[i].y)//1.共位
            {
                samePosition++;
            }
            else if (points[j].x == points[i].x) //2.共X
            {
                sameX++;
            }
            else if (points[j].y == points[i].y) //3.共Y
            {
                sameY++;
            }
            else              //4.共斜率
            {
                /*
                (double) p=(double)(points[i].y - points[j].y)/(double)(points[i].y - points[j].y);
                if (map.containsKey(p)) //如果原来包含这个斜率,那么值+1
                {
                    map.put(p, map.get(p) + 1);
                }
                else                    //如果没有这个斜率,则添加且值为1
                {
                    map.put(p, 1);
                }*/
                int x = points[i].x - points[j].x;
                int y = points[i].y - points[j].y;
                int m_gcd = gcd(x, y);
                //最大公约数不会丢失精度
                x /= m_gcd;
                y /= m_gcd;
                string strp = to_string(y) + "_" + to_string(x);
                if (mymap.count(strp)) //如果原来包含这个斜率,那么值+1
                {
                    auto iter = mymap.find(strp);
                    mymap.insert(make_pair(strp, iter->second + 1));
                }
                else                    //如果没有这个斜率,则添加且值为1
                {
                    mymap.insert(make_pair(strp, 1));
                }
             }
    }
      //value值出来,排序,然后取最大值
        vector<int> myvalue;
        for (auto itmap = mymap.begin(); itmap != mymap.end(); itmap++)
        {
            myvalue.push_back(itmap->second);

        }
        sort(myvalue.begin(), myvalue.end());
        int m_max = myvalue.size() - 1;
        result = myvalue[m_max];

    return result;
}

 

原文链接: https://www.cnblogs.com/jasmineTang/p/14369268.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    算法(40)-直线斜率-C++

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/328971

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月1日 下午4:56
下一篇 2023年3月1日 下午4:56

相关推荐