思路
维护一个n双端tan队列,使得每次更新,双端队列的First值都是最大值,
具体做法:
1、 先将前k个值压入双端队列,在压入的过程中,若正在压入的值大于队尾的值,剔除队尾的值,直到队列为空或者队尾的值大于等于当前的值。
2、每次滑动的时候,如果窗口左边要抛弃的值正好为前一次队列的最大值,将队列的该值弹出对头,让后让窗口右边即将加入的值按照1,的方式塞入
代码
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
Deque<Integer> q = new ArrayDeque<>();
int begin = 0;
int end = k;
List<Integer> result = new LinkedList<>();
for(int i = 0;i<k;i++){
if(q.size()>0){
while(!q.isEmpty()&&q.getLast()<nums[i]){
q.removeLast();
}
q.addLast(nums[i]);
}
else{
q.addLast(nums[i]);
}
}
result.add(q.getFirst());
for(int j = k;j<nums.length;j++){
if(nums[j-k]==q.getFirst())
q.removeFirst();
if(q.size()>0){
while(!q.isEmpty()&&q.getLast()<nums[j]){
q.removeLast();
}
q.addLast(nums[j]);
}
else{
q.addLast(nums[j]);
}
result.add(q.getFirst());
}
int[] r = new int[result.size()];
for(int i = 0;i<r.length;i++){
r[i] = result.get(0);
result.remove(0);
}
return r;
}
}