java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块

java数据结构与算法刷题目录(剑指Offer、LeetCode、ACM)-----主目录-----持续更新(进不去说明我没写完):https://blog.csdn.net/grd_java/article/details/123063846

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块_第1张图片

解题思路
  1. 这道题可以理解为,只能保证块内有序的情况下,可以分成多少块,完成排序。也就是我们把数组分成若干块,不能块与块之间排序,块和块之间相对位置也不能变,只能每一个块,对其中块内元素进行排序。最终保证整个数组有序。
  2. 已知数组元素取值,是0~n-1,也就是和数组下标一一对应。那么排完序后的数组,一定是数组下标和元素值一一对应的
  3. 所以,这道题可以用贪心的思想,如果块内最大值正好和当前下标对应上的话,那么就可以分一块,否则肯定不能多分一块。具体看下图:
    java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块_第2张图片
    java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块_第3张图片
  4. 上面,我们发现,从3开始,每次新添加一个元素进入分块时,都满足下标对应,那么如果直到最后才对应上呢?当然用这个思路也没有问题:
    java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块_第4张图片
关键点在于
  1. 数组排好序后,与下标是对应的。当前我们拿到子序列,分一个块,排序后,一定是最大值在最后。最后面这个最大值,如果和下标对应上,就说明,这一块和最终排序号的完整序列是对应上的。
代码:时间复杂度O(n) 空间复杂度O(1)

java数据结构与算法刷题-----LeetCode769. 最多能完成排序的块_第5张图片

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;
    }
}

你可能感兴趣的:(算法,java,算法,排序算法,leetcode)