[LeetCode] 769、最多能完成排序的块

题目描述

数组arr[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?

输入: arr = [4,3,2,1,0]
输出: 1
解释:
将数组分成2块或者更多块,都无法得到所需的结果。
例如,分成 [4, 3], [2, 1, 0] 的结果是 [3, 4, 0, 1, 2],这不是有序的数组。

解题思路

见下:

  • 排序 + 后处理:先排序,再对比两个数组。

  • 追踪最大值:由于该数组的特殊性,要看到某个点 i 能不能切分,就看它和左边区间 [ :i] 里的最大值是不是和 i 本身相同。如果是就可以切分,如果不是说明肯定还有更大的值在其中,需要换到更后面的位置,就不能在该处切分。(我的实现)

参考代码

class Solution {
public:
    int maxChunksToSorted(vector<int>& arr){
        int length = arr.size();
        if(length == 0)
            return 0;
        
        int leftmax = arr[0];
        int res = 0;
        for (int i = 0; i < length; ++i) {
            leftmax = max(leftmax, arr[i]);

            if (leftmax == i)
                res ++;
        }

        return res;
    }

};
发布了417 篇原创文章 · 获赞 605 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/ft_sunshine/article/details/104073796