239. 滑动窗口最大值

双端队列:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        // 利用双端队列存储当前窗口的最大值序列,队头为对当前窗口最大值,后面的值依次递减
        ArrayDeque que = new ArrayDeque();

        // 返回结果
        int[] ans = new int[nums.length-k+1];
        for(int i = 0; i < nums.length; i++)
        {
            // 移除所有队尾中小于等于 nums[i]的值
            while(que.size() > 0 && nums[que.getLast()] <= nums[i])
            {
                que.removeLast();
            }

            // 当前元素下标加入队尾
            que.addLast(i);

            // 当前窗口 的下标范围 为 [i - k + 1, i],左右都为闭区间
            // ind: 前一次遍历窗口的最左边下标
            int ind = i - k;

            // 移除队头中所有属于 [0, i - k]的下标
            while(que.getFirst() <= ind){
                 que.removeFirst();               
            }

            // 记录区间的最大值
            // 如果在for外面提前处理了[0, k - 2], 注意 k = 1的情况 这里就不需要这个判断了, i就直接从 k - 1
            if(ind >= -1)
            {
                ans[ind + 1] = nums[que.getFirst()];
            }
        }
        return ans;
    }
}

直接遍历每次寻找当前窗口最大值:

// TODO

你可能感兴趣的:(数据结构与算法,TODO,算法,java,leetcode)