平时用leetcode刷的较多,突然改成acm还有点懵
MyQueue 的作用Deque)实现一个单调递减队列,确保队列头部始终是当前窗口的最大值。add(int val):添加元素时,移除队列尾部所有小于 val 的元素(例如队列为 [3,1],添加 2 时移除 1,变为 [3,2]),保持队列单调递减。poll(int val):移除元素时,只有当被移除的值等于队列头部值时才弹出头部(例如队列为 [3,2],移除 3 时弹出头部)。peek():直接返回队列头部元素,即当前最大值。Solution 的步骤res 和计数器 num。MyQueue。myqueue.peek())。myqueue.poll(heights[i - limit]))。myqueue.add(heights[i]))。res[num++] = myqueue.peek())。class MyQueue {
Deque<Integer> deque = new LinkedList<>();
//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出
//同时判断队列当前是否为空
void poll(int val){
if(!deque.isEmpty() && val == deque.peek()){
deque.poll();
}
}
//添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出
//保证队列元素单调递减
//比如此时队列元素3,1,2将要入队,比1大,所以1弹出,此时队列:3,2
void add(int val){
while(!deque.isEmpty() && val > deque.getLast()){
deque.removeLast();
}
deque.add(val);
}
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxAltitude(int[] heights, int limit) {
if(heights.length <= 1 ){ // 此处与卡哥代码里的不同
return heights;
}
//对结果数组进行初始化
int len = heights.length - limit + 1;
int[] res = new int[len];
int num = 0;
MyQueue myqueue = new MyQueue();
//先将前k个放入队列
for(int i = 0; i < limit; i++){
myqueue.add(heights[i]);
}
res[num++] = myqueue.peek();
for(int i = limit; i < heights.length; i++){
//滑动窗口移除最前面的元素
myqueue.poll(heights[i - limit]);
//加入新元素
myqueue.add(heights[i]);
//记录最大值
res[num++] = myqueue.peek();
}
return res;
}
}