题目描述
给定一个长度为 n 的整数数组 arr ,它表示在 [ 0 , n - 1 ] 范围内的整数的排列。
我们将 arr 分割成若干 块 ( 即分区) ,并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。
返回数组能分成的最多块数量。
示例 1 :
输入: arr = [ 4 , 3 , 2 , 1 , 0 ]
输出: 1
解释:
将数组分成2 块或者更多块,都无法得到所需的结果。
例如,分成 [ 4 , 3 ] , [ 2 , 1 , 0 ] 的结果是 [ 3 , 4 , 0 , 1 , 2 ] ,这不是有序的数组。
示例 2 :
输入: arr = [ 1 , 0 , 2 , 3 , 4 ]
输出: 4
解释:
我们可以把它分成两块,例如 [ 1 , 0 ] , [ 2 , 3 , 4 ] 。
然而,分成 [ 1 , 0 ] , [ 2 ] , [ 3 ] , [ 4 ] 可以得到最多的块数。
提示:
n == arr. length
1 <= n <= 10
0 <= arr[ i] < n
arr 中每个元素都 不同
解题思路
这是一道利用贪心的思想来解决的问题,维护一个最大值,判断它的值是否与区间内对应的下标位置的值相等,如果相等,最后的结果直接+1,循环遍历整个数组即可。
题目代码
class Solution {
public int maxChunksToSorted ( int [ ] arr) {
int ans = 0 , n = arr. length, max = 0 ;
for ( int i = 0 ; i < n; i++ ) {
max = Math . max ( max, arr[ i] ) ;
if ( max == i) ans++ ;
}
return ans;
}
}
运行结果