美文网首页
剑指offer | 滑动窗口的最大值

剑指offer | 滑动窗口的最大值

作者: icebreakeros | 来源:发表于2019-08-04 13:30 被阅读0次

滑动窗口的最大值

给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值

示例
输入:{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;
    }
}

相关文章

网友评论

      本文标题:剑指offer | 滑动窗口的最大值

      本文链接:https://www.haomeiwen.com/subject/rzmkdctx.html