Sliding Window Maximum
/**
* @param nums: A list of integers.
* @return: The maximum number inside the window at each moving.
*/
public ArrayList<Integer> maxSlidingWindow(int[] nums, int k) {
if (nums == null || nums.length == 0 || k <= 0) return winMax;
int len = nums.length;
Deque<Integer> deque = new ArrayDeque<Integer>();
// remove the smaller in the rear of queue
while ((!deque.isEmpty()) && (nums[i] > deque.peekLast())) {
deque.pollLast();
}
// push element in the rear of queue
deque.offer(nums[i]);
// remove invalid max
if (i + 1 > k && deque.peekFirst() == nums[i - k]) {
deque.pollFirst();
if (i + 1 >= k) {
winMax.add(deque.peekFirst());
}
}
return winMax;
}
}
- 移除队尾元素时首先判断是否为空,因为在移除过程中可能会将队列元素清空。
- 在移除队尾元素时
nums[i] > deque.peekLast()
不可取等于号,因为这样会将相等的元素全部移除,这样会在窗口中部分元素相等时错误地移除本该添加到最终结果的元素。 - 移除失效元素和添加元素到最终结果时需要注意下标
i
和的关系,建议举例确定。