您现在的位置是:首页 > 编程 > 

滑动窗口最大值问题

2025-07-27 18:38:06
滑动窗口最大值问题 一·题目:leetcode原题链接: . - 力扣(LeetCode)二·思路汇总:思路:滑动窗口,在数组位置建立一个双端队列利用出入队列来模拟窗口平移,即首先把第一个窗口入进去,接着i遍历原数组剩下的元素,每次入剩下的元素相当于窗口右移,对于维护窗口即维护队列,由于要的是每次得到的窗口中最大值故当每次入队列的时候,比较原值和队列放的队尾下标对应的值,如果原值大即right--

滑动窗口最大值问题

一·题目:

leetcode原题链接: . - 力扣(LeetCode)

二·思路汇总:

思路:滑动窗口,在数组位置建立一个双端队列利用出入队列来模拟窗口平移,即首先把第一个窗口入进去,接着i遍历原数组剩下的元素,每次入剩下的元素相当于窗口右移,对于维护窗口即维护队列,由于要的是每次得到的窗口中最大值故当每次入队列的时候,比较原值和队列放的队尾下标对应的值,如果原值大即right--,把它往队前放,反之放后面 目的:(每次队列中放入的是原数组下标,这样操作为了保证队列中的下标是升序,对应的值为降序,每次取窗口的最大值,即left处值)(可能队列中数据不足k个但由于每次只要最大值,即left处,可以控制当每次新入数据,通过维护队列,使得left处为最大值,只要保证每次队列数据<=k即可)。

三·解答代码:代码语言:javascript代码运行次数:0运行复制
int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {
    int queue[numsSize];//这里下标是numsSize不是k+1,由于队列即会在原数组内滑动,故下标会变化但队列内元素最大是k+1
    int left=0;
    int right=0;
    int size=numsSize-k+1;//窗口个数,即最大值个数
    *returnSize=0;
    for(int i=0;i<k;i++){//先把第一组窗口数据入队列
        while(left<right&&nums[i]>=nums[queue[right-1]]){
            right--;//按照下标升序,对应值降序排列(可能会<k个)
        }
        queue[right++]=i;
    }
    int*ret=(int*)calloc(size,sizeof(int));
    ret[(*returnSize)++]=nums[queue[left]];//得到第一个窗口的最大值
    for(int i=k;i<numsSize;i++){//i往后遍历数组,即窗口后移
         while(left<right&&nums[i]>=nums[queue[right-1]]){
            right--;
        }
        queue[right++]=i;//先把后面遍历到的i放入,然后情况可能是:1·对应值最大被移到了left剩下的覆盖掉:2·在中间位置;·最小直接插后面
        if(queue[left]+k<=i){//有可能队列内的数据个数为k+1即最大程度,这时由于队列中的下标按照升序排列,即对应的原数组的顺序,即这个窗口要包含此时入的数据,需要left出队列即left++;
            left++;//由于每次入队列的数据都进行判断故最大数据个数为k+1,只需要移动一次所以用if而不是while
        }
        

        ret[(*returnSize)++]=nums[queue[left]];   
    }
    
    return ret;
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。 原始发表:2024-08-15,如有侵权请联系 cloudcommunity@tencent 删除遍历队列数据数组int

#感谢您对电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格的认可,转载请说明来源于"电脑配置推荐网 - 最新i3 i5 i7组装电脑配置单推荐报价格

本文地址:http://www.dnpztj.cn/biancheng/1132020.html

相关标签:无
上传时间: 2025-07-18 19:52:28

上一篇:回文序列问题

下一篇:c++中的Stack与Queue

留言与评论(共有 11 条评论)
本站网友 雅培奶粉事件
15分钟前 发表
分享自作者个人站点/博客
本站网友 房产信息
2分钟前 发表
由于队列即会在原数组内滑动
本站网友 丹皮的功效
27分钟前 发表
对于维护窗口即维护队列
本站网友 超级环
11分钟前 发表
即这个窗口要包含此时入的数据
本站网友 赵客缦胡缨
8分钟前 发表
比较原值和队列放的队尾下标对应的值
本站网友 txt文本合并器
22分钟前 发表
由于队列即会在原数组内滑动
本站网友 现代家具
12分钟前 发表
只要保证每次队列数据<=k即可)
本站网友 江南证券
9分钟前 发表
通过维护队列
本站网友 国外免费空间
7分钟前 发表
如有侵权请联系 cloudcommunity@tencent 删除前往查看遍历队列数据数组int
本站网友 北京市房地产交易网
7分钟前 发表
对应值降序排列(可能会<k个) } queue[right++]=i; } int*ret=(int*)calloc(size