769. 最多能完成排序的块

解题思路:

  • 首先明确一个观念,排好序的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);
posted on 2022-10-13 18:49  叶落偏多雨  阅读(50)  评论(0)    收藏  举报