#include <iostream> #include <vector> #include <algorithm> #include <unordered_map> using namespace std; int findleftmaxnum(vector<int> &nums,int l,int r) {     int maxnum = nums[l];     for(int i=l;i<r;i++)     {         maxnum = maxnum<nums[i]?nums[i]:maxnum;     }     return maxnum; } int findrightindex(vector<int> &nums,int maxnum, int l) {     int index = l;     for(int i = nums.size()-1;i>l;i--)     {         if(nums[i]<maxnum)             return i;     }     return l; } //10 //69079936 236011312 77957850 653604087 443890802 277126428 755625552 768751840 993860213 882053548 int main() {     int n = 0;     cin>>n;     vector<int > nums,numa;     unordered_map<int, int> mp;     for(int i=0;i<n;i++)     {         int temp = 0;         cin>>temp;         nums.push_back(temp);         numa.push_back(temp);         mp[temp] = i;     }     sort(nums.begin(),nums.end());//排序用于定位当前区间的最小值     int count = 0;     for(int i=0;i<nums.size();i++)     {         int temp = nums[i];         int index = mp[temp];         int maxnum = findleftmaxnum(numa,i,index);//找到当前区间的最小值左侧的最大值元素的值         int right =findrightindex(numa,maxnum,index);//从当前区间的最右侧开始 找到第一个小于上一步找到的最大值的值         i = right;//划分区间         count++;              }     cout<<count<<endl;     return  1; } //12 18 14 11 15 6 7 14 20 6 19 20 23 22 //2 1 3 2 4 3 5 3 6 5 7 6 7 答题的时候A了18,后来发现判断条件的时候多了个等号,去掉后感觉能提高不少,思路类似快排,只不过每次先找当前区间的最小值,然后找最小值左侧的最大值,判断这个最小值和最大值确定的区间能覆盖的范围,该范围就是一个满足要求的区间,然后再进行后面区间的partition。 C++代码。
点赞 评论

相关推荐

投递腾讯等公司10个岗位
点赞 评论 收藏
转发
牛客网
牛客企业服务