[转载]剑指 Offer 59

题目链接

代码

    public int[] maxSlidingWindow(int[] nums, int k) {
        // 考虑数组中只有一个数
        if (nums.length == 0 || k == 0) return new int[0];
        // 采用双端队列
        Deque<Integer> deque = new LinkedList<>();
        // 简单分析结果只有nums.length - k + 1个数
        int[] res = new int[nums.length - k + 1];

        // 先让队列中在k个数形成降序
        for (int i = 0; i < k; i++) { // 未形成窗口
            // 把队列中,从队尾开始,所有比当前nums[i]的数字抛出
            while (!deque.isEmpty() && deque.peekLast() < nums[i])
                deque.removeLast();
            deque.addLast(nums[i]);
        }

        System.out.println(deque);

        // 第一个k个数中的最大值。
        res[0] = deque.peekFirst();

        // 然后在剩下的数字中接着
        for (int i = k; i < nums.length; i++) { // 形成窗口后
            // 如果当前的数字和前面k个数字中最大的数字相等,那么抛出队列中已经有的,当然这边是从头开始
            if (deque.peekFirst() == nums[i - k])
                deque.removeFirst();
            // 这一步是关键,如果队尾数字比双端队列中的数字要大,那么说明
            while (!deque.isEmpty() && deque.peekLast() < nums[i])
                deque.removeLast();
            deque.addLast(nums[i]);
            res[i - k + 1] = deque.peekFirst();
        }
        return res;
    }


    //作者:jyd
    //链接:https://leetcode-cn.com/problems/hua-dong-chuang-kou-de-zui-da-zhi-lcof/solution/mian-shi-ti-59-i-hua-dong-chuang-kou-de-zui-da-1-6/
    //来源:力扣(LeetCode)
    //著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
原文地址:https://www.cnblogs.com/bears9/p/13845479.html