Deque
双端队列
Sliding Window Maximum
经典的运用Deque构造monotonic decreasing queue的题目
因为window size is fixed, 所以跟sliding window没啥关系
class Solution {
/*
monotolic queue in decresing order, store index of element
for loop to iterate each element from nums {
1. from left to right, remove idx from queue which is out of range,
2. from right to left, remove idx from queue which nums[idx] <= nums[i]
3. queue.offer(i)
4. update res if i >= k - 1
}
*/
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length < k) {
return new int[0];
}
int N = nums.length;
int[] res = new int[N - k + 1];
Deque<Integer> deque = new LinkedList<>();
int idx = 0;
for (int i = 0; i < N; i++) {
//from left to right, remove idx from queue which is out of range,
while (!deque.isEmpty() && deque.peekFirst() <= i - k){
deque.pollFirst();
}
//from right to left, remove idx from queue which nums[idx] <= nums[i]
while (!deque.isEmpty() && nums[deque.peekLast()] <= nums[i]){
deque.pollLast();
}
deque.offer(i);
//skip the first few elements that is less than k
if (i >= k - 1) {
res[idx++] = nums[deque.peekFirst()];
}
}
return res;
}
}
Last updated
Was this helpful?