Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into some number of "chunks" (partitions), and individually sort each chunk.  After concatenating them, the result equals the sorted array.

What is the most number of chunks we could have made?

Example 1:

Input: arr = [4,3,2,1,0]
Output: 1
Explanation:
Splitting into two or more chunks will not return the required result.
For example, splitting into [4, 3], [2, 1, 0] will result in [3, 4, 0, 1, 2], which isn't sorted.

Example 2:

Input: arr = [1,0,2,3,4]
Output: 4
Explanation:
We can split into two chunks, such as [1, 0], [2, 3, 4].
However, splitting into [1, 0], [2], [3], [4] is the highest number of chunks possible.

Note:

  • arr will have length in range [1, 10].
  • arr[i] will be a permutation of [0, 1, ..., arr.length - 1].


1. Iterate the array, if all the elements on the left are smaller than the elements on the left, there is a new chunk. The first solution use two arrays, leftMax[i] to record the max element ending at i and starting from 0, rightMin[i] to record element starting at i and ending at 0.

Time complexity: O(n)

Space complexity: O(n)

class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr == null) return 1; int sz = arr.length;
int[] leftMax = new int[sz];
int[] rightMin = new int[sz]; leftMax[0] = arr[0];
for(int i = 1; i < sz; ++i) {
leftMax[i] = Math.max(leftMax[i-1], arr[i]);
} rightMin[sz-1] = arr[sz-1];
for(int i = sz-2; i >= 0; --i) {
rightMin[i] = Math.min(rightMin[i+1], arr[i]);
} int count = 1;
for(int i = 0; i < sz-1; ++i) {
if(leftMax[i] < rightMin[i+1] ) ++count;
} return count;
}
}

1a. Since we iterate either from left to right or right to left, we do not need two arrays to keep all the previous record and can use one varible to record the max element from the left so far, as long as the max element is smaller than the min element on the right, there is a new chunk

class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr == null) return 1; int sz = arr.length;
int[] rightMin = new int[sz];
rightMin[sz-1] = arr[sz-1];
for(int i = sz-2; i >= 0; --i) {
rightMin[i] = Math.min(rightMin[i+1], arr[i]);
} int max = arr[0];
int count = 1;
for(int i = 0; i < sz-1; ++i) {
max = Math.max(max, arr[i]);
if(max < rightMin[i+1]) ++count;
} return count;
}
}

1b. Iterate from right to left:

class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr == null) return 1; int sz = arr.length;
int[] leftMax = new int[sz];
leftMax[0] = arr[0];
for(int i = 1; i < sz; ++i) {
leftMax[i] = Math.max(leftMax[i-1], arr[i]);
} int rightMin = arr[sz-1];
int count = 1;
for(int i = sz-1; i >= 1; --i) {
rightMin = Math.min(rightMin, arr[i]);
if(leftMax[i-1] < rightMin) {
++count;
}
}
return count;
}
}

2. Since arr[i] will be a permutation of [0, 1, ..., arr.length - 1], each element is unique and after sorted, arr[i] = i, the elements on the left will be smaller than the elemnts on the right, as long as the max element at index i is arr[i].

Time complexity: O(n)

Space complexity: O(1)

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

2a Another slightly optimisation to terminate the loop early if the max element arr[arr.length-1] is found

class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr == null) return 1; int maxSoFar = arr[0];
int count = 0;
for(int i = 0; i < arr.length; ++i) {
maxSoFar = Math.max(maxSoFar, arr[i]);
if(maxSoFar == arr.length-1) return count+1;
if(maxSoFar == i) ++count;
} return count;
}
}

3. Another way to think, if we consider each chunk, as a range [min, max] ended at max, if the next element is smaller than the previous max, we need to merge the range by poping up the max element of chunks which max element is bigger, we need to include the new element in the poped up chunks, otherwise, push the new max element. The number of elements on the stack means the number of chunks.

[4, 3, 2, 1, 0] -> [4] for 4 -> [4] for 3 -> [4] for 2 -> [4] for 1 -> [0]

[1, 0, 2, 3, 4] -> [1] -> [1] -> [1, 2] -> [1, 2, 3] -> [1, 2, 3, 4]

[1, 2, 0, 3] -> [1] -> [1, 2] -> [2] -> [2, 3]

Time complexity: O(n)

Space complexity: O(n)

class Solution {
public int maxChunksToSorted(int[] arr) {
Deque<Integer> maxStack = new LinkedList<Integer>(); for(int num: arr) {
if(maxStack.isEmpty() || num > maxStack.peek()) {
maxStack.push(num);
}
else {
int max = maxStack.peek();
while(!maxStack.isEmpty() && num < maxStack.peek()) {
maxStack.pop();
}
maxStack.push(max);
}
} return maxStack.size();
}
}

3a It can be observed from the code that we always push the current max as where the range ends.

public class Solution {

    public int maxChunksToSorted(int[] arr) {
Deque<Integer> maxStack = new LinkedList<Integer>(); for(int num: arr) {
int currMax = maxStack.isEmpty()? num: Math.max(num, maxStack.peek()); while(!maxStack.isEmpty() && num < maxStack.peek()) {
maxStack.pop();
} maxStack.push(currMax);
} return maxStack.size();
}
}

4. Another way is to caculate the distance between the current index with the expected sorted index, if the sum is 0, the whole chunk could be a sorted array.

Time complexity: O(n)

Space complexity: O(1)

public class Solution {

    public int maxChunksToSorted(int[] arr) {

        int count = 0, sum = 0;
for(int i = 0; i < arr.length; ++i) {
sum += arr[i] - i;
if(sum == 0) ++count;
}
return count;
} }

Max Chunks To Make Sorted LT769的更多相关文章

  1. [LeetCode] Max Chunks To Make Sorted II 可排序的最大块数之二

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  2. [LeetCode] Max Chunks To Make Sorted 可排序的最大块数

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...

  3. [Swift]LeetCode768. 最多能完成排序的块 II | Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  4. [leetcode]Weekly Contest 68 (767. Reorganize String&&769. Max Chunks To Make Sorted&&768. Max Chunks To Make Sorted II)

    766. Toeplitz Matrix 第一题不说,贼麻瓜,好久没以比赛的状态写题,这个题浪费了快40分钟,我真是...... 767. Reorganize String 就是给你一个字符串,能不 ...

  5. LeetCode - 768. Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  6. 最多的划分来使数组有序 Max Chunks To Make Sorted

    2018-12-01 11:05:46 一.Max Chunks To Make Sorted 问题描述: 问题求解: 由于没有重复,所以直观的来看对于每个遇到数,其能够被划分出来的前提是其前面已经有 ...

  7. Max Chunks To Make Sorted II LT768

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  8. 768. Max Chunks To Make Sorted II

    This question is the same as "Max Chunks to Make Sorted" except the integers of the given ...

  9. [LeetCode] 769. Max Chunks To Make Sorted 可排序的最大块数

    Given an array arr that is a permutation of [0, 1, ..., arr.length - 1], we split the array into som ...

随机推荐

  1. JavaScript Drag处理

    [JavaScript Drag处理] 在拖动目标上触发事件 (源元素): ondragstart - 用户开始拖动元素时触发 ondrag - 元素正在拖动时触发 ondragend - 用户完成元 ...

  2. react input的几个坑

    [react input的几个坑] 1.input标签中设置value后,input进入controlled模式,valuechange由自动变为手动,导致input无法编辑.如: <input ...

  3. sql 2012的补丁 SP4下载地址

    https://www.microsoft.com/zh-cn/download/confirmation.aspx?id=56040

  4. OWAPSP_ZAP使用

    启动OWAPSP_ZAP后 netstat -pantu | grep 8080

  5. day14 迭代器和生成器

    1.迭代器 名词解释 什么是迭代:迭代是一个重复过程,但是每次重复都是基于上一次的结果而继续的 #下列循环只是单纯的重复,没有意义 while True: print(1) #基于索引的迭代取值 l ...

  6. powerdesigenr设置主外键颜色

    使用PowerDesigner时,它默认table的字体大小颜色等非常难看: 如果通过 Symbol ---> Format进行设置,只能对选中的最修改,新建的Table无效. 可以通过如下修改 ...

  7. Python+Selenium学习--打印当前页面的title及url

    场景 测试中,访问1个页面然后判断其title是否符合预期是很常见的1个用例,所谓用例不够,title来凑就是这个道理.更具体一点,假设1个页面的title应该是'hello world', 那么可以 ...

  8. 有关ngui grid中去除一项后的排序问题

    遇到这个问题,是在实现一个公告栏界面的时候,公告栏可以新增一条公告,也可以删除一条公告. 新增很简单,这里不做多的介绍: 关于删除,之前的代码是: GameObject go = is_parent. ...

  9. http://www.bugku.com:Bugku——SQL注入1(http://103.238.227.13:10087/)

    Bugku——SQL注入1(http://103.238.227.13:10087/) 过滤了几乎所有的关键字,尝试绕过无果之后发现,下面有个xss过滤代码.经搜索得该函数会去掉所有的html标签,所 ...

  10. 1.尽量以const ,enum,inline替换define

    1.#define为预处理阶段命令 原因:有可能记号名称没有进入记号表,而出现编译错误,即编译器并没看到过该定义. class专属常量const 一般定义为static,保证该常量至多有一份实体. 枚 ...