滑动窗口的最大值
给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值
示例
输入:{2, 3, 4, 2, 6, 2, 5, 1}
和3
输出:{4, 4, 6, 6, 6, 5}
分析
只把有可能成为滑动窗口最大值的数值存入到一个两端开口的队列中,最大值始终为队列头元素
public class MaxInSlidingWindow {
/**
*
* @param numbers
* @param k window size
* @return
*/
public List<Integer> maxInWindow(int[] numbers, int k) {
List<Integer> result = new LinkedList<>();
if (numbers.length >= k && k >= 1) {
Deque<Integer> deque = new LinkedList<>();
// 滑动窗口初始化,维持队列中只包含最大值下标
for (int i = 0; i < k; i++) {
while (!deque.isEmpty()
&& numbers[i] >= numbers[deque.peekLast()]) {
deque.removeLast();
}
deque.addLast(i);
}
for (int i = k; i < numbers.length; i++) {
result.add(numbers[deque.peekFirst()]);
while (!deque.isEmpty()
&& numbers[i] >= numbers[deque.peekLast()]) {
deque.removeLast();
}
if (!deque.isEmpty() && deque.peekFirst() <= (i - k)) {
deque.removeFirst();
}
deque.addLast(i);
}
result.add(numbers[deque.peekFirst()]);
}
return result;
}
}
网友评论