题目链接:https://leetcode-cn.com/problems/sliding-window-maximum/
题意:在一个数组上有一个长度为k的滑动窗口,每次向右移一位,求滑动窗口的最大值。
分析:首先要明确一个概念,每次滑动窗口加入一个值后,当前窗口内所有比它小的值都不可能当最大值了。所以我们可以用一个单调队列来做,当每读取一个新值,如果此时队尾都比他大(因为单增所以前面所有值都比他大),就直接放弃,不可能成为最大值,否则就把当前队列中每一个比它小的值全部丢掉,之后加入这个新值。
class Solution { public int[] maxSlidingWindow(int[] nums, int k) { int head=0,tail=-1; int len = nums.length; int[] q = new int[len]; int[] p = new int[len]; int[] ans = new int[len-k+1]; for(int i=0;i<len;i++){ q[i]=0; p[i]=0; } for(int i=0;i<len;i++){ while(head<=tail&&q[tail]<=nums[i])tail--; q[++tail]=nums[i];p[tail]=i; while(p[head]<=i-k)head++; if(i>=k-1) ans[i-k+1]=q[head]; } return ans; } }