头条上机算法题(最大点问题)

版权声明:版权所有,转载请注明出处 https://blog.csdn.net/songchuwang1868/article/details/88167088

P为给定的二维平面整数点集。定义 P 中某点x,如果x满足 P 中任意点都不在 x 的右上方区域内(横纵坐标都大于x),则称其为“最大的”。求出所有“最大的”点的集合。(所有点的横坐标和纵坐标都不重复, 坐标轴范围在[0, 1e9) 内)

如下图:实心点为满足条件的点的集合。请实现代码找到集合 P 中的所有 ”最大“ 点的集合并输出。

思路:

对于所有的点先按照y从大到小排序O(NlongN)

从大到小遍历排好序的点集,当前y是出现过的最大的y,即是需要的结果,进行输出O(N)。

总体时间复杂度为O(NlogN)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main()
{
    ios::sync_with_stdio(false);//提升cin和cout的性能
    int n_pointer=0;
    cin>>n_pointer;
    vector<pair<int,int>> xys;
    for(int i=0;i<n_pointer;i++)
    {
        int x,y;
        cin>>x>>y;
        xys.push_back(make_pair(x,y));
    }
     
    sort(xys.begin(),xys.end(),[](pair<int,int> &p1,pair<int,int> &p2)->bool{
        return p1.second>p2.second;
    });
     
    int max_x=-1;

    for(auto &pair:xys)
    {
        if(pair.first>max_x)
        {
            cout<<pair.first<<" "<<pair.second<<endl;
            max_x=pair.first;
        }
    }
     
    return 0;
}

猜你喜欢

转载自blog.csdn.net/songchuwang1868/article/details/88167088
今日推荐