问题描述:
给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。返回数组能分成的最多块数量。
样例如下:
代码及思路如下:
public class MaxChunksToSorted {
//给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。
//我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,
// 使得连接的结果和按升序排序后的原数组相同。
//返回数组能分成的最多块数量。
public static int maxChunksToSorted(int[] arr) {
//思路,记录每一块的最大值,若end指针和这一块的最大值相等,则将分块的个数++
int st = 0; //开始指针
int end = 0;//结束指针
int max = arr[st]; //记录最大值
int count = 0;
while (st<=end){
if (max == end) {
//说明找到了分界点
count++;
st = end+1;
if (st<arr.length) {
end = st;
max = arr[end];
}else break;
continue;
}
end++;
if (end<arr.length) {
if (max < arr[end]) {
//更新这一块中的最大值
max = arr[end];
}
}else break;
}
return count;
}
public static void main(String[] args) {
int[] arr = {4,3,2,1,0};
System.out.println(maxChunksToSorted(arr));
int[] arr1 = {1,0,2,3,4};
System.out.println(maxChunksToSorted(arr1));
}
}
结果如下: