题目描述
数组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;
}
};