输出滑动窗口最大值(双端队列)

给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值。

示例:

输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3
输出: [3,3,5,5,6,7] 

import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;

/**
 * 滑动窗口最大值
 */
public class Solution {

    public Solution() {
    }

    ;

    /**
     * 遍历,暴力法
     * O(Nlogk)
     * @param nums
     * @param k
     * @return
     */
    public int[] maxSlidingWindow(int[] nums, int k) {
        int n = nums.length;
        if (n * k == 0) {
            return new int[0];
        }
        int[] output = new int[n - k + 1];
        for (int i = 0; i < n - k + 1; i++) {
            int max = Integer.MIN_VALUE;
            for (int j = i; j < i + k; j++) {
                max = Math.max(max, nums[j]);
            }
            output[i] = max;
        }
        return output;
    }

    /**
     * 双端队列
     * 滑动窗口作为双端队列
     * O(N)
     * @param nums
     * @param k
     * @return
     */
    public int[] maxSlidingWindowDeque(int[] nums, int k) {
        int n = nums.length;
        if (n * k == 0) {
            return new int[0];
        }
        int[] output = new int[n - k + 1];
        Deque<Integer> window = new ArrayDeque<>();//也可以用数组模拟
        for (int i = 0; i < n; i++) {
            // 每次移动窗口时,窗口左边的元素从队列中删除
            if (i >= k && window.peek() <= i - k + 1) {
                window.remove(0);
            }
            // 新入队列元素,与队列中元素遍历比较,删除小于nums[i] 的元素
            while (!window.isEmpty() && nums[window.peekLast()] <= nums[i]) {
                window.removeLast();
            }
            window.add(i);
            // 队列左侧是最大值,加入结果
            if (i - k + 1 >= 0) {
                output[i - k + 1] = nums[window.peek()];
            }
        }
        return output;
    }

    public static void main(String[] args) {
        int[] aa = {3, 5, -1, 2, 8, 4};
        Solution ob = new Solution();
        int[] out = ob.maxSlidingWindowDeque(aa, 3);
        System.out.println(Arrays.toString(out));
    }
}

 

发布了25 篇原创文章 · 获赞 54 · 访问量 19万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览