239. Sliding Window Maximum

这个题比想象的容易,尤其是看了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;
    }
}
posted @ 2016-12-12 04:29  哇呀呀..生气啦~  阅读(85)  评论(0)    收藏  举报