问题描述:
解答:
一开始申请了一堆最大值,最大值索引,次大值,次大值索引,次次大值,次次大值索引和当前值比较,来记录遍历时的情况,发现一些特殊情况很难表达,注入k=1,2什么的,而且有漏洞。
后来搜索了一下答案,是用队列来记录,想法还是差不多的,不过比我那种要好表达的多。
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if(nums.length==0){
return new int[0];
}
int[] res=new int[nums.length-k+1];
LinkedList<Integer> deque = new LinkedList<Integer>();
for(int i=0;i<nums.length;i++){
//滑动窗口时移除不在窗口中的最大值
while(!deque.isEmpty()&&deque.peekFirst()==i-k){// [i-k+1,i]窗口共K个数字
deque.pollFirst();
}
//队列中储存索引i,保持队列中的nums[i]是绝对降序的
while(!deque.isEmpty()&&nums[deque.peekLast()]<nums[i]){
deque.pollLast();
}
deque.offer(i);
if(i-k+1>=0){
res[i-k+1]=nums[deque.peekFirst()];
}
}
return res;
}
}