题目意思 : 给一个长度为 n 的数组, 其元素的值也是从 0 ~ n - 1 的一个排列, 我们将这个数组分为若干部分, 将这些部分独自地排序, 然后将这些部分连接起来, 这个结果和将原数组直接排序的结果相同.
没找到这背后的规律, 查看了一下其他大神的思路 : 这个算法就是找到一些分割线, 在这条线的左边的数字都小于这条线右边的数字. 这个数组排序好的结果就是每个元素和下标的值相等. 所以只需要记录目前为止的最大值, 如果最大值等于索引, 那么到这条线的左边的所有数字都小于这个点, 排序之后就会满足要求, 结果加一.
class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr.length == 0 || arr == null)
return 0;
int max[] = new int[arr.length];
max[0] = arr[0];
for(int i = 1; i < arr.length; i++) {
max[i] = Math.max(max[i - 1], arr[i]);
}
int result = 0;
for(int i = 0; i < arr.length; i++) {
if(max[i] == i)
result++;
}
return result;
}
}
上面是用一个数组来维护当前的最大值, 但是这个 max 的值肯定是不断增大的, 所以可以只用一个 max 来维护即可.
class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr == null || arr.length == 0)
return 0;
int count = 0, max = 0;
for(int i = 0; i < arr.length; i++) {
max = Math.max(max, arr[i]);
if( i == max)
count++;
}
return count;
}
}