#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++代码。