算法小知识-----10.13----- 最多能完成排序的块

62 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第16天,点击查看活动详情

本来已经是周六了,毕竟已经上了6天班了,怎么才周四啊

最多能完成排序的块

该题出自力扣的769题 —— 最多能完成排序的块【中等题】

审题

给定一个长度为 n 的整数数组 arr ,它表示在 [0, n - 1] 范围内的整数的排列。 我们将 arr 分割成若干 块 (即分区),并对每个块单独排序。将它们连接起来后,使得连接的结果和按升序排序后的原数组相同。 返回数组能分成的最多块数量。

  • 这道题虽然是中等题,但是题意并不复杂,就是给出一个整型数组,按照块分配数量,返回最大可分配的数量,但是前提是最终分配的快,排序之后要跟数组的原升序一致
  • 一开始是想用数组解法的,也就是开辟一个数组,然后用数组记录原数组对应下标值的原下标,但是确实是会遗漏一些边界细节
  • 那么后续又想用暴力实现,暴力就很简单了,直接遍历0到n,在内部再寻找当前下标所对应的原数组,极端情况下是O(n²)的时间复杂度
  • 最后使用的是遍历数组,寻找最大值,如果当前下标的最大值与变量作比较,如果最大值等于当前下标,也就是值,那么就证明一定是最大值,当遍历到第i个位置时,如果可以切分为块,那前i个位置的最大值一定等于i。否则,一定有比i小的数划分到后面的块,那块排序后,一定不满足升序。

编码

class Solution {
    public int maxChunksToSorted(int[] arr) {
        int len = arr.length;
        int num = 0;
        int max = 0;
        for (int i = 0; i < len;i++) {
            max = Math.max(arr[i],max);
            if (max == i)num++;
        }
        return num;
    }
}

image.png