题目大意:
最多能完成排序的块
数组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-解题思路分析/
Pingback引用通告: LEETCODE 768. Max Chunks To Make Sorted II 解题思路分析 – Leetcode刷题