使用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;
}
}

本文介绍了一种高效求解滑动窗口中最大值的算法。通过使用双端队列(deque),可以在O(n)的时间复杂度内找到指定窗口大小内的最大元素。详细解释了双端队列的使用方法及其实现细节。
3万+

被折叠的 条评论
为什么被折叠?



