这个题比想象的容易,尤其是看了hints之后。
本质是要保留窗内元素的ORDER,并且删除元素时不影响ORDER。
说实话如果不看HINTS之后比较难想到,看了HINT就很容易了。
一个queue,保存index,删除从head删,添加从tail添加。
每次要保证head是最大的。
比如 6 2 1 4 7,K = 3
添加 6 2 1 没什么可说的,此时Queue是这样的:
0 1 2,注意我们保存的是index.
到4的时候,首先判断最大元素是不是出界了,或者说是不是在窗户外了。
最大元素我们把它放在HEAD,(后面会说怎么做),head的index 是 0,出界,那么poll了他,此时queue是
1 2
我们要添加4,从尾端添加,要一个一个比较,如果tail元素比当前要小,直接poll了不管它。
比如我们要保留3个,K = 3, 那么当前元素左边的2个元素只要比自己小,就与结果无关,直接poll了行了,因为他们在。。故我在,我比他们大,they are useless then..
我们不需要维持大小是3的QUEUE= =
说得好乱,这个东西其实比较容易理解= =说起来感觉反而有点绕,和KMP一样。
public class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (k == 0) return new int[0];
int[] res = new int[nums.length - k + 1];
int largest = 0;
LinkedList<Integer> list = new LinkedList<>();
for (int i = 0; i < nums.length; i++) {
if (!list.isEmpty() && list.peekFirst() <= i - k) {
list.pollFirst();
}
while (!list.isEmpty() && nums[list.peekLast()] < nums[i]) {
list.pollLast();
}
list.offerLast(i);
if (i - k + 1 >= 0) {
res[i - k + 1] = nums[list.peekFirst()];
}
}
return res;
}
}