栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

LeetCode239. 滑动窗口最大值

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

LeetCode239. 滑动窗口最大值

思路

暴力解法会时间超时。所以就只能用单调队列来解决了。

首先用数组来实现单调队列,定义一个数组,用来实现单调队列里面存放下标,head指向队列的头节点(且当前头结点在滑动窗口内),tail指向队列的尾结点。

1.队列加入元素

当队列要加入一个元素时,因为本题是单调递增的,所以在加入一个元素时,如果当前元素比队列尾部元素小,就直接加入;如果比尾部元素大,就把队列里所有比当前元素小的元素删除,然后将当前元素加入队列即可。

2.判断窗口向前滑动

当队列头指针指向的元素已经不在当前窗口内里就是窗口向后移动了,head也向后移动一位。

3.何时将队列元素加入结果集中

只要滑动窗口的大小为3时,就将队列中头元素的值加入到结果集中。

代码

暴力代码:超时

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int index = 0;
        int max  = nums[0];
        int[] res = new int[nums.length-k+1];
        int index2 = 0;
        for(int i = 0;i=max){
                    max = nums[index];
                }
                index++;
            }
            res[index2++] = max;
        }
        return res;
    }
}

用单调队列(数组)来实现:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        int index = 0;
        int head = 0;
        int tail = -1;
        int[] moQue = new int[nums.length];
        int[] res = new int[nums.length-k+1];
        for (int i = 0; i < nums.length; ++ i) {
            // 判断队头是否已经滑出窗口
            if (head <= tail && i - k + 1 > moQue[head])  ++ head;
            
            // 维护队列的单调性
            while (head <= tail && nums[i] > nums[moQue[tail]])  -- tail;
            moQue[++ tail] = i;
            
            // 输出最小值
            if (k <= i + 1) 
                res[index++] = nums[moQue[head]];
        }
        return res;
    }
}

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/925888.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号