算法:生成窗口最大值数组

本文介绍了一种利用队列解决滑动窗口最大值问题的方法。在给定整型数组arr和窗口大小w的情况下,通过维护一个按大小排列的队列,当窗口向右移动时,队列能有效地更新最大值。队列保存的是最大值的下标,如果队头元素不在窗口内,则将其排除,确保队列始终包含窗口内的最大值。提供了两种不同的代码实现方法。
摘要由CSDN通过智能技术生成

题目描述

有一个整型数组arr和一个大小为w的窗口从数组的最左边划到最右边,窗口每次向右滑动一个位置
如数组为[4,5,8,2],窗口大小为2时
[4 5] 8 2 最大值是5
4 [5 8] 2 最大值是8
4 5 [8 2] 最大值是8
数组长度为n窗口大小为w,则一共产生n-w+1个窗口最大值

  • 输入:整型数组arr,窗口大小w
  • 输出:一个长度为n-w+1的数组res,res[i]表示每种窗口状态下的最大值,上例应返回[5, 8, 8]。

题目分析

可以先把初始窗口的最大值记录下来,每次向右移动一个位置,就看看最大的元素有没有被移除如果被移除了,则需要能找到第二大的元素,因此不能仅仅保存最大的数,用一个队列来保存,从头到尾按大小排列,新加入的元素需要按照大小给一个排位(事实上,原本队列中的比新元素小的元素可以被舍弃,因为他们本来就比新元素前,比新元素先排除,不会再新元素移除后成为次大的元素)。
那么队列应该保存什么数据呢,可以有两种:

  1. 保存具体最大的数值,如果移出的元素等于队头的元素,就把队头元素排除(会不会出现这种情况:队列中有小于当前队头,但是在当前队头前面的值,在这个值排出时,因为他不是队头,没有被比较排除,然后在后面成为队头?不会,队列中其他元素不会有比队头前的值,根据上面的条件,现在队头的这个值在入队时就把队列中小于他的值舍弃掉了,队列中比当前队头大的值又会在前面被排除)
  2. 保存最大的数值的下标,如果队头元素位置已不在窗口则把队头排除

代码实现

方法一

public int[] getMax2(int[] array,int w){
   
        if(array == null || w < 1 || w>array.length)
            return null;
        if(array.length == 0)
            return new int[0];
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值