力扣 - 768. 最多能完成排序的块II
题目
思路
- 利用单调递减栈来解题
- 遍历数组,将元素存入栈中,再利用max记录当前栈顶的最大值
- 如果遇到比当前栈元素大的值,那么可以直接入栈,因为可以单独分一块;但是如果遇到比当前栈顶元素小的值,那么应该将之前的元素依次出栈,直到遇到小于等于该值的元素停止出栈,然后将max再push入栈(push的这个max就代表了这一个块)
- 例如:有该数组 {1, 1, 3, 4, 5, 2, 6, 7},此时栈为
- 接下来遍历到2了,2比max即5小,所以开始出栈,顺序是:5、4、3,由于1小于2,所以停止出栈,接下来将max(5)入栈,此时栈为:
- 不断遍历,直到数组遍历结束,此时栈中有多少个元素就代表有多少个块了
- 分块规则:后一块元素的最小值大于等于前一块元素的最大值
代码
class Solution {
public int maxChunksToSorted(int[] arr) {
Deque<Integer> stack = new LinkedList<Integer>();
int max = -1;
for (int i = 0; i < arr.length; i++){
if (!stack.isEmpty() && arr[i] < arr[max]) {
while (!stack.isEmpty() && arr[i] < arr[stack.peek()]) {
stack.pop() ;
}
// 此处不能stack.push(i),push的必须是这一组的最大值
stack.push(max);
} else {
stack.push(i);
max = stack.peek();
}
}
return stack.size();
}
}
复杂度分析
- 时间复杂度:\(O(N)\), N 为数组长度
- 空间复杂度:\(O(N)\),N为栈的大小
我走得很慢,但我从不后退!

浙公网安备 33010602011771号