解题思路:
- 首先明确一个观念,排好序的arr中arr[i]=i;
- 而如果出现了位置arr[i]≠i,则说明至少 i 位置到 arr[i] 位置都是无序的;
- 而如果从 i 位置到 arr[i] 位置中有比 arr[i] 更大的位置 maxl ,则会将上限更新到更大的位置;
- 而我们计数时,只有直到不会发更新为止(不会发生更新则说明 i 等于 maxl )才计数一次;
- 对于arr[i]=i的数据,如果它们在i 位置到 arr[i] 位置中,则说明其处于无序状态,只有不位于其中才为有序状态,才会计数一次;
代码实现:
class Solution {
public:
int maxChunksToSorted(vector<int>& arr) {
int n=arr.size();
int num=0;
int maxl=0,flag=0;
for(int i=0;i<n;i++)
{
if(flag==0&&arr[i]==i) //不位于无序状态中num++
{
num++;
}
if(arr[i]!=i) //进入了无序状态
{
if(flag==0) //flag置1
{
flag=1;
num++;
}
maxl=max(maxl,arr[i]); //更新上限
}
if(i==maxl) //判读是否退出了无序状态
{
flag=0;
maxl=0;
}
}
return num;
}
};
复杂度分析:
- 时间复杂度为O(n);
- 空间复杂度为O(1);