我为大家画了一下大致的流程
以下是按照上面的思路对Leetcode239题的解答,理解了滑动窗口之后这道题目就很简单了,代码如下
public int[] maxSlidingWindow(int[] nums, int k) {
//双端队列
LinkedList<Integer> linkedList = new LinkedList();
//结果集 数量为 nums.length - k + 1
int[] res = new int[nums.length-k+1];
//记录结果集下标
int index = 0;
for (int r = 0; r <nums.length ; r++) {
//右端右滑时,新进的数 > 双端队列尾的数
while (!linkedList.isEmpty() && nums[r]>nums[linkedList.peekLast()]){
linkedList.pollLast();
}
//将对应的下标加入队列尾巴
linkedList.addLast(r);
//左侧滑动到0的时候开始记录数据
if (r-k+1>=0){
res[index] = nums[linkedList.peekFirst()];
index++;
}
//左侧滑出的下标和队列头最大值下标一致时,将队列头推出
if (r-k+1 == linkedList.peekFirst()){
linkedList.pollFirst();
}
}
return res;
}