X

LEETCODE 769. Max Chunks To Make Sorted 解题思路分析

题目大意:

最多能完成排序的块

数组arr[0, 1, ..., arr.length - 1]的一种排列,我们将这个数组分割成几个“块”,并将这些块分别进行排序。之后再连接起来,使得连接的结果和按升序排序后的原数组相同。

我们最多能将数组分成多少块?

示例 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] 可以得到最多的块数。

注意:

  • arr 的长度在 [1, 10] 之间。
  • arr[i][0, 1, ..., arr.length - 1]的一种排列。

如果想查看本题目是哪家公司的面试题,请参考以下免费链接: https://leetcode.jp/problemdetail.php?id=769

解题思路:

这道题目有些绕,简单来看就是把一个数组先分块,再排序,这样排序的结果是否与将数组整个排序的结果一致。核心思想便是:由于数组的数字是从0到数组长度减一之间不重复的数字,也就是说在排序完成之后,数组下标要与该下标所对应的值相同。例如:

arr[0] = 0;
aar[15] = 15;
aar[99] = 99;

因此在考虑如何分块时就要知道,当前位置的数,应该在什么位置?,比如index为0的位置出现了数字8,那么,至少到index8为止是不能被分割的,否则,如果在index8之前被分割了,数字8就再也没有机会排序到index8了。接下来再看下一位,如果下一位小于8可以无视,要是大于8,比如9,则说明到index9为止是不能被分割的,直到当前的index等于之前所有不能被分割index的最大值,说明当前index及其之前包含了所有小于等于当前index的数字,此时分割数组,之前的数字可以排序。之后的处理逻辑不变,直到循环结束。这道题的思路与
763. 划分字母区间 的思考逻辑一模一样。可以作为参考。

看下完整代码:

public int maxChunksToSorted(int[] arr) {
    int count = 0; // 定义返回结果
    int maxShouldToRight = 0; // 用于记录最远可被分割位置
    for (int i = 0; i < arr.length; i++) {
        // 更新最远可被分割位置
        maxShouldToRight = Math.max(maxShouldToRight, arr[i]);
        // 当前位置等于最远可被分割位置时,可在当前位置分割
        if (i == maxShouldToRight) {
            // 结果加一
            count++;
        }
    }
    return count;
}

本题解法用时0ms。

本网站文章均为原创内容,并可随意转载,但请标明本文链接
如有任何疑问可在文章底部留言。为了防止恶意评论,本博客现已开启留言审核功能。但是博主会在后台第一时间看到您的留言,并会在第一时间对您的留言进行回复!欢迎交流!
本文链接: http://leetcode.jp/leetcode-769-max-chunks-to-make-sorted-解题思路分析/
Categories: leetcode
admin:

View Comments (0)