leetcode239题滑动窗口的最大值
基于单调队列,单调栈需要自己实现,
单调队列:队列中维护的是一个最大值,当需要加入的数比这个数小时候,加入队列的尾部,反之,移开单调队列中所有比这个数小的数,然后从数组里面一个一个取出来,放在单调队列里面。
java中deque的说明:
-
deque是一个双端队列的接口,继承自Queue接口,deque的实现类是LinkedList ArrayQueue 等 LinkedList是最常用的
-
作为队列时
- add方法等于addLast 将数据添加到队列的尾部
- remove 等于队列中removeFirst 移除第一个元素
- poll pollFirst 弹出队列的第一个数
- element getFirst 获得第一个元素
作为队列时:
push方法等于addFirst
pop方法等于removeFirst
peek 等于peekFirst()
代码的思路已经很清楚了:
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
// 现在队列已经实现完成了,开始写代码了
MyQuque myque = new MyQuque();
int len = nums.length - k + 1;
int[] res = new int[len];
int num = 0;
for(int i = 0;i < k;i++){
//这里可不可以继续合并了
myque.add(nums[i]);
}
res[num++] = myque.peek();
for(int i = k;i < nums.length;i++){
myque.poll(nums[i - k]);
myque.add(nums[i]);
res[num++] = myque.peek();
}
return res;
}
}
class MyQuque{
Deque<Integer> myque = new LinkedList<Integer>();
//为什么键盘不管用了 bug就这么多么
public void poll(int val){
if(!myque.isEmpty() && val == myque.peek()){
myque.poll();
}
}
public void add(int num){
while(!myque.isEmpty() && num > myque.getLast()){
myque.removeLast();
}
myque.add(num);
}
public int peek(){
return myque.peek();
}
}