public int[] maxAltitude(int[] heights, int limit) {
if (heights.length 0) {
int[] result = new int[0];
return result;
}
int n = heights.length;
int[] result = new int[n – limit + 1];
Deque deque = new ArrayDeque<>(); // 双端队列存储索引
for (int i = 0; i < n; i++) {
// 移除窗口外的索引
if (!deque.isEmpty() && deque.getFirst() < i - limit + 1) {
deque.pollFirst();
}
// 移除所有小于当前值的索引(保持队列单调递减)
while (!deque.isEmpty() && heights[deque.getLast()] <= heights[i]) {
deque.pollLast();
}
// 将当前索引加入队列
deque.addLast(i);
// 当窗口形成时(即 i >= limit - 1),记录窗口最大值
if (i >= limit - 1) {
result[i - limit + 1] = heights[deque.getFirst()];
}
}
return result;
}
共以下 12 个回答
将可能作为最大值的放入队列中,按顺序取出即可,为保证单调性,每次移动时小的数放在后面,大的数直接把之前清空再添加
时间复杂度O(n)
空间复杂度O(limit)
解题思路
– 使用单调队列来存储(条件范围内的最大值的顺序)
– 队列头->尾巴:从大->小 (越老的越在前面),新元素都是offerLast
– 每一次右边界右移都需要考虑:
– 1、新节点比队列里面哪些元素要大,就淘汰那些元素(从尾巴去淘汰)
– 2、哪些节点已经比左边界小了,就淘汰那些元素(从头去淘汰)
– 左边界右移只需要从队列里面取最大值即可,不需要考虑淘汰元素的问题
【题解1】
利用双端队列实现
单调队列的功能
思路: 使用 栈实现
思路:维护一个单调队列,保证队列中存储的是滑动窗口内的最大值
时间复杂度:O(n)
空间复杂度:O(n)
利用大根堆来记录滑动窗口最大值以及下标,当下标超出范围时删除堆顶的元素。
时间复杂度O(Nlogn),空间复杂度O(N)。
public int[] maxAltitude(int[] heights, int limit) { deque = new ArrayDeque<>(); // 双端队列存储索引
if (heights.length 0) {
int[] result = new int[0];
return result;
}
int n = heights.length;
int[] result = new int[n – limit + 1];
Deque
思路
代码
OnOn
class Solution { deque = new ArrayDeque();
public int[] maxSlidingWindow(int[] nums, int k) {
int n = nums.length;
int[] res = new int[n – k + 1];
int j = 0;
Deque
for(int i = 0;i < n; i++){
while(!deque.isEmpty() && i – deque.peek() + 1 > k){
deque.poll();
}
while(!deque.isEmpty() && nums[deque.peekLast()] < nums[i]){
deque.pollLast();
}
deque.offer(i);
if(i >= k-1){
res[j++] = nums[deque.peek()];
}
}
return res;
}
}
时间:O(n)
空间:O(n)