*LeetCode-Sliding Window Maximum

使用double ended queue 叫deque 读deck

两边都可以add peek remove

用这个que来keep一个window 里面存index 假如访问到 i 然后que的head小于 i - k + 1就说明出了window 就remove head

假如queue的tail小于当前 i 的value 就remove它 直到不再小 add(num[ i] ) 这样可以保证queue里面是升序的 且每次head就是需要找的max

public class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if ( nums == null || nums.length == 0 )
            return new int [0];
        Deque <Integer> dque = new ArrayDeque <Integer> ();
        int n = nums.length;
        int [] res = new int [ n - k + 1 ];
        int j = 0;
        for ( int i = 0; i < n; i ++ ){
            if ( !dque.isEmpty() && dque.peekFirst() <= i - k ) 
                dque.removeFirst ();
            while ( !dque.isEmpty() && nums[ dque.peekLast() ] < nums [ i ] )
                dque.removeLast();
            dque.addLast( i );
            if ( i >= k - 1){
                res [ j ] = nums [dque.peekFirst()];
                j ++;
            }
        }
        return res;
    }
}


你可能感兴趣的:(*LeetCode-Sliding Window Maximum)