美文网首页硬核空间技术博客
leetcode239.滑动窗口最大值

leetcode239.滑动窗口最大值

作者: 憨憨二师兄 | 来源:发表于2020-04-24 15:59 被阅读0次

题目链接

解题思路一:最大堆

本题中,滑动窗口内的数字个数固定为k,从左依次滑动到右侧,要求返回滑动窗口的最大值,我们自然而然就可以想到使用最大堆这种数据结果解决这个问题。
代码如下:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length - k + 1];
        if(nums == null || nums.length == 0 || k == 0 || nums.length < k){
            return res;
        }
        // 建立建立最大堆
        PriorityQueue<Integer> maxHeap = new PriorityQueue<Integer>(new Comparator<Integer>() {
            @Override
            public int compare(Integer i1, Integer i2) {
                return i2 - i1;
            }
        });
        for(int i = 0;i < nums.length;i++){
            if(maxHeap.size() >= k){
                maxHeap.remove(nums[i - k]);
            }
            maxHeap.offer(nums[i]);
            if(i >= k - 1){
                res[i - k + 1] = maxHeap.peek();
            }
        }
        return res;
    }
}

因为maxHeap.remove(nums[i - k]); 这个操作为O(k)的时间复杂度,所以该算法整体的复杂度为O(n*k);额外空间复杂度为O(k)
执行结果:

解题思路二:双端队列

本思路是使用双端队列,涉及到滑动窗口的问题都可以使用双端队列进行解决。
双端队列Deque用来保存窗口最大数值的index值
每次都是用队列的队尾与新进入的数字进行比较,如果队列队尾要比新的值小,那么就出队。

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int[] res = new int[nums.length - k + 1];
        if(nums == null || nums.length == 0 || k == 0 || nums.length < k){
            return res;
        }

        Deque<Integer> maxDeq = new LinkedList<>();
        for(int i = 0;i < nums.length;i++){
            while(!maxDeq.isEmpty() && nums[maxDeq.peekLast()] < nums[i]){
                maxDeq.pollLast();
            }
            maxDeq.addLast(i);
            if(maxDeq.peekFirst() == i - k){
                maxDeq.pollFirst();
            }
            if(i >= k - 1){
               res[i - k + 1] = nums[maxDeq.peekFirst()]; 
            }
        }
        return res;
    }
}

使用双端队列的时间复杂度为O(n),额外空间复杂度使用了双端队列这种数据结构,为O(k)
执行结果:


相关文章

  • leetcode239.滑动窗口最大值

    题目链接 解题思路一:最大堆 本题中,滑动窗口内的数字个数固定为k,从左依次滑动到右侧,要求返回滑动窗口的最大值,...

  • LeetCode239.滑动窗口最大值

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

  • 队列的最大值

    滑动窗口的最大值给定一个数组和滑动窗口的最大值,找出所有滑动窗口里的最大值。例如输入[2, 3, 4, 2, 6,...

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

    滑动窗口的最大值 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值 示例输入:{2, 3, 4, 2, ...

  • 59-滑动窗口最大值、队列的最大值

    1. 滑动窗口的最大值 给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值。 示例:输入:...

  • JZ-064-滑动窗口的最大值

    滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,...

  • 剑指Offer66题

    1、滑动窗口的最大值 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4...

  • 面试题59(剑指offer)--队列的最大值

    题目一: 滑动窗口的最大值。给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3...

  • 剑指Offer Java版 面试题59:队列的最大值

    题目一:滑动窗口的最大值。给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3...

  • 面试题59:队列的最大值

    题目 滑动窗口的最大值给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。例如,如果输入数组{2,3,4,...

网友评论

    本文标题:leetcode239.滑动窗口最大值

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