题目
思路
- API小能手表示可以先把第一个窗口加进去,然后加一个减一个用API求最大值即可。
- 然后就被卡时间了,果然不能取巧,想想有没有解决办法。
- 用一个双端队列存储数组的下标(为了方便取值)。
- 如果加入的数大于当前队首的值就弹出所有队列里的值且加入该数,如果大于队列中部分值,也弹出它们且加入该数,这样可以保证队列永远是从大到小排序的。
- 双端队列设立LR,首先令L=0,R增到规定的k后开始记录答案,每一次判断是否加入都要将L和R往后移一位,模拟窗口每次的滑动。
- 如果队首的下标值小于L的话,需要弹出队列里所有值,因为此时的“最大值”不在[L,R]范围内。
代码
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums == null || nums.length<2) return nums;
LinkedList<Integer> queue = new LinkedList<>();
int[] result = new int[nums.length-k+1];
for(int i=0;i<nums.length;i++){
while(!queue.isEmpty() && nums[queue.peekLast()]<=nums[i]){
queue.pollLast();
}
queue.addLast(i);
if(queue.peek() <= i-k) queue.poll();
if(i+1>=k) result[i+1-k]=nums[queue.peek()];
}
return result;
}