LeetCode 每日一题:最多能完成排序的块

88 阅读2分钟

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

最多能完成排序的块

原题地址

给定一个长度为 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] 可以得到最多的块数。

示例 3:

输入: arr = [4,2,3,0,1,6,5]
输出: 2
解释:
我们可以把它分成两块,例如 [4, 2, 3, 0, 1], [6, 5]。
可以得到[0,1,2,3,4,5,6]

提示:

  • n == arr.length
  • 1 <= n <= 10
  • 0 <= arr[i] < n
  • arr 中每个元素都 不同

思路分析

  1. 深度理解分析题目,可以得知,对于最后可以排成一个升序数组,那每一块中最大的数值应该是跟块的长度 - 1相同;
  2. 定义 max 来临时存储每个块中的最大值,result = 0 来存储可以分成几个块;
  3. 遍历数组,max 取 max 和 arr[i] 的最大值,若 max 跟当前下标即i 相同时,需要给 result 进行加一的操作;
  4. 最后返回 result 即可。

AC 代码

/**
 * @param {number[]} arr
 * @return {number}
 */
var maxChunksToSorted = function(arr) {
    let max = 0
    let res = 0
    for(let i = 0; i < arr.length; i++) {
        max = Math.max(arr[i], max)
        if(max === i ) res++
    }
    return res
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了57.78%的用户
  • 内存消耗:40.9 MB, 在所有 JavaScript 提交中击败了46.11%的用户
  • 通过测试用例:52 / 52

END