题目描述:
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。
示例:输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3 ; 输出: [3,3,5,5,6,7]
题目分析:
从头到尾遍历元素,元素的索引进队列:
- 当队列为null时,元素索引进队列;
- 若nums[i] >= queue.peekLast();元素循环出队;
- 若nums[i] < queue.peekLast();元素进队;
- 判断:若 i - k == queue.peekFirst(); queue.removeFirst();
- 判断:若 i >= k - 1; res[index++] = nums[queue.peekFirst()];
参考代码:
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length == 0 || k > nums.length || k < 1)return new int[]{};
int[] res = new int[nums.length - k + 1];
LinkedList<Integer> queue = new LinkedList<>();
int index = 0;
for(int i = 0; i < nums.length; i++){
//1.进队列
while(!queue.isEmpty() && nums[i] >= nums[queue.peekLast()])queue.removeLast();
queue.addLast(i);
//2.判断窗口是否超过指定窗口大小
if(i - k == queue.peekFirst())queue.removeFirst();
//3.窗口生成时,存贮最大值
if(i >= k - 1)res[index ++] = nums[queue.peekFirst()];
}
return res;
}
注意:
队列中存储的是元素下标,不是具体元素。