1.题目描述:
数组arr是[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。我们最多能将数组分成多少块?
2.普通解法:
观察数组可以发现,如果i索引之前的元素及他本身中最大值为i,那么这些元素有序排列后和整个数组有序排列的结果一致,就可以成块,利用这个规律从左往右遍历数组即可,时间复杂度为O(n)。图解及代码都相对简单。
class Solution {
public int maxChunksToSorted(int[] arr) {
int resNum = 0;
int max = 0;
for(int i = 0;i < arr.length;i++){
max = Math.max(max,arr[i]);
if(max == i){
resNum++;
}
}
return resNum;
}
}