思路
- 单调栈
- 只有块内部才可以进行排序,块的位置不能发生变化
- 如果说可以进行分块,前一个块的最大值 一定比 后一个块的最小值要小
- 我们的核心其实就是找到从左到右开始不减少(增加或者不变)的地方并分块。
- 比如 [2,1,3,4,4],遍历到 1 的时候会发现 1 比 2 小,因此 2, 1 需要在一块,我们可以将 2 和 1 融合,并重新压回栈。那么融合成 1 还是 2 呢?答案是 2,因为 2 是瓶颈,这提示我们可以用一个递增栈来完成。
因此本质上栈存储的每一个元素就代表一个块,而栈里面的每一个元素的值就是块的最大值。
代码
class Solution {
public int maxChunksToSorted(int[] arr) {
if(arr.length == 0 || arr == null){
return 0;
}
LinkedList<Integer> stack = new LinkedList<>();
for(int i = 0; i < arr.length; i++){
int temp = -1;
while(!stack.isEmpty() && stack.getLast() > arr[i]){
temp = Math.max(temp,stack.getLast());
stack.removeLast();
}
if(temp !=-1){
stack.add(temp);
}else{
stack.add(arr[i]);
}
}
return stack.size();
}
}