题目:给你一个数组和一个窗口大小k,要求窗口从数组开始滑动,求解各个窗口的最大值
[leetcode239]https://leetcode.com/problems/sliding-window-maximum/
算法步骤
- 使用一个双端队列,遍历数组,如果遇到的数比大于等于队列末尾的数,那么就弹出队列中的数,知道队列末尾大于当前数或者队列为空,然后把当前数加到队列中去。
- 检查队列开始的数是否有效,如果无效则应该弹出队列开头的数。
- 从i大于等于窗口时,队列首部就是以当前数为最右侧的窗口的最大值。
算法原理
由上述可知,队列头始终存储最大的数,但是小一些的那些书也不能丢弃,是因为如果队列头无效了,那么小一些的数就派上用场了。
等于时也有弹出是因为前边的数一定比后边的数先无效。
代码:
public class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums==null||k<1||nums.length<k)
return new int[0];
int len=nums.length;
int[] res=new int[len-k+1];
LinkedList<Integer> queue=new LinkedList<Integer>();
int index=0;
for(int i=0;i<len;i++){
int cur=nums[i];
while(!queue.isEmpty()&&nums[queue.peekLast()]<=cur){
queue.pollLast();
}
queue.addLast(i);
if(i-k==queue.peekFirst())
queue.pollFirst();
if(i>=k-1){
res[index++]=nums[queue.peekFirst()];
}
}
return res;
}
}