LeetCode-239-滑动窗口最大值
思路
参考动画演示 单调队列 239.滑动窗口最大值
维护一个单调递减队列,
- 当队列为空,或者当前元素小于队尾元素,当前元素下标入队
- 当前元素大于队尾元素,则队尾出队
- 判断队头元素下标是否在窗口内,否则出队
- 当前的队头元素就是当前滑动窗口最大值
代码
//这个好理解些
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res=new int[nums.length-k+1];
Deque<Integer> dq=new LinkedList<>();
int left=0;
int i=0;
for(int right=0;right<nums.length;right++){
while(!dq.isEmpty()&&nums[dq.peekLast()]<nums[right]){
dq.removeLast();
}
dq.addLast(right);
if(left>dq.peekFirst()){
dq.removeFirst();
}
if(right>=k-1){
res[i++]=nums[dq.peekFirst()];
left++;
}
}
return res;
}
//参考
public int[] maxSlidingWindow(int[] nums, int k) {
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> queue = new LinkedList<>();
for(int i=0;i<nums.length;i++){
while(!queue.isEmpty()&&nums[queue.peekLast()]<=nums[i]){
queue.removeLast();
}
queue.addLast(i);
int j=i-k+1;//当前左窗口下标
if(j>queue.peekFirst()){
queue.removeFirst();
}
//右下标大于等于k
if(i+1>=k){
res[j]=nums[queue.peekFirst()];
}
}
return res;
}