java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846 |
---|
解题思路 |
---|
- 这道题可以理解为,只能保证块内有序的情况下,可以分成多少块,完成排序。也就是我们把数组分成若干块,不能块与块之间排序,块和块之间相对位置也不能变,只能每一个块,对其中块内元素进行排序。最终保证整个数组有序。
- 已知数组元素取值,是0~n-1,也就是和数组下标一一对应。那么
排完序后的数组,一定是数组下标和元素值一一对应的
- 所以,这道题可以用贪心的思想,如果块内最大值正好和当前下标对应上的话,那么就可以分一块,否则肯定不能多分一块。具体看下图:
- 上面,我们发现,从3开始,每次新添加一个元素进入分块时,都满足下标对应,那么如果直到最后才对应上呢?当然用这个思路也没有问题:
关键点在于 |
---|
- 数组排好序后,与下标是对应的。当前我们拿到子序列,分一个块,排序后,一定是最大值在最后。最后面这个最大值,如果和下标对应上,就说明,这一块和最终排序号的完整序列是对应上的。
代码:时间复杂度O(n) 空间复杂度O(1) |
---|
class Solution {
public int maxChunksToSorted(int[] arr) {
int m = 0,res = 0;//m表示当前块内,最大值是多少,如果和下标不对应,则无法分块排序
for(int i = 0; i < arr.length; i++){
m = Math.max(m,arr[i]);//新元素加入块中
if(m == i) res++;//如果和下标对应上,就可以多分一块
}
return res;
}
}