双端队列:滑动窗口最大值——01

该博客介绍了如何利用双端队列解决滑动窗口最大值问题。通过遍历数组并维护一个从大到小排列的双端队列,当窗口向右移动时剔除不再在窗口内的元素,保持队列左侧始终为窗口内的最大值。这种方法是单调栈思想的一种扩展。代码注解帮助理解算法实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目:

输入是一个一维整数数组,和一个表示滑动窗口大小的整数;输出是一个一维整数数组,表
示每个时刻时的窗口内最大值。

思路:

       1.利用双端队列进行操作:每当向右移动时,把窗口左端的值从队列左端剔除,把队
列右边小于窗口右端的值全部剔除。这样双端队列的最左端永远是当前窗口内的最大值。另外,
这道题也是单调栈的一种延申:该双端队列利用从左到右递减来维持大小关系。

       2.遍历数组,将 数 存放在双向队列中,并用 L,R 来标记窗口的左边界和右边界。队列中保存的并不是真的 数,而是该数值对应的数组下标位置,并且数组中的数要从大到小排序。如果当前遍历的数比队尾的值大,则需要弹出队尾值,直到队列重新满足从大到小的要求。刚开始遍历时,L 和 R 都为 0,有一个形成窗口的过程,此过程没有最大值,L 不动,R 向右移。当窗口大小形成时,L 和 R 一起向右移,每次移动时,判断队首的值的数组下标是否在 [L,R] 中,如果不在则需要弹出队首的值,当前窗口的最大值即为队首的数。

结合代码注解理清思路:

class Solution {
    public int[] maxSlidingWindow(int[] nums, int k) {
        if (nums == null || nums.length < 2) return nums;
 // 双向队列 保存当前窗口最大值的数组位置 保证队列中数组位置的数值按从大到小排序
        LinkedList<Integer> queue = new LinkedList(); 
    // 结果数组
       int[] result =new int[nums.length-k+1];
 // 遍历nums数组
       for (int i = 0; i < nums.length; i++){
// 保证从大到小 如果前面数小则需要依次弹出,直至满足要求
           while (!queue.isEmpty() && nums[queue.peekLast()] <= nums[i]){
               queue.pollLast();
           }
 // 添加当前值对应的数组下标
           queue.addLast(i);
   // 判断当前队列中队首的值是否有效
           if (queue.peek() <= i-k){
               queue.poll();
           }
 // 当窗口长度为k时 保存当前窗口中最大值
           if (i+1 >= k){
               result[i+1-k] = nums[queue.peek()];
           }
       }
       return result;
    }

}

Windows 的早期版本相比,Windows 10 对操作系统的更新行为的 UI 控制更少,没有选项可以使用Windows 10 中的”控制面板”或”设置”应用程序关闭 Windows 更新,它会自动检查更新并安装更新 查找,不管您是否喜欢。 实际上,此新功能对于大多数用户来说非常方便。 如果要控制更新过程,可以禁用 Windows Update 服务。 这要求您打开服务管理器,找到服务并更改其启动参数和状态。 然后,每当您希望操作系统检查更新时,您都必须再次启用该服务(这看起来并不容易)。 Windows 屏蔽更新工具 Windows Update Blocker 中文版Windows 屏蔽更新工具 Windows Update Blocker 中文版 Windows Update Blocker 是一个免费软件,可以帮助您通过单击按钮完全禁用或启用 Windows 系统上的自动更新。 该实用程序是可移植的,这意味着您不再需要执行安装过程,并且在删除硬盘后,硬盘上不会残留任何残留物。 如果将程序文件放置在外部数据设备上,则可以随身携带 Windows Update Blocker,并在与您接触的任何计算机上使用它,该计算机的配置正确,并且不希望使用 更新可能会破坏其系统的机会。 该实用程序适用于该人。 这个怎么运作 下载后,将 Windows Update Blocker 解压缩到所需位置,然后运行它。服务状态图标将显示您的 Windows 更新服务状态,如果您想阻止 Windows 自动更新,请选择“禁用服务”并单击“立即应用”按钮,保护服务设置可以防止不受控制的更改(推荐)。 支持的操作系统:Windows 10,Windows 8.1Windows 8,Windows 7,Windos Vista,Windows XP(32 \ 64位)。 支持的语言:英语,土耳其语,德语,希伯来语,斯洛文尼亚语,法语,俄语,葡萄牙语,意大利语,波兰语,西班牙语,捷克语,乌克兰语,荷兰语,希腊语,匈牙利语,简体中文,繁体中文,葡萄牙语(巴西),泰语,阿拉伯语, 韩语,越南语,日语,印尼语,波斯语,瑞典语,泰语,格鲁吉亚语,丹麦语(丹麦语),阿尔巴尼亚语,阿塞拜疆语,保加利亚语,塞尔维亚语
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只程序小洋

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值