滑动窗口最大值问题

server/2024/9/23 11:12:52/

目录

一·题目:

二·思路汇总:

三·解答代码:


一·题目:

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

二·思路汇总:

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

三·解答代码:

int* maxSlidingWindow(int* nums, int numsSize, int k, int* returnSize) {int queue[numsSize];//这里下标是numsSize不是k+1,由于队列即会在原数组内滑动,故下标会变化但队列内元素最大是k+1int 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·在中间位置;3·最小直接插后面if(queue[left]+k<=i){//有可能队列内的数据个数为k+1即最大程度,这时由于队列中的下标按照升序排列,即对应的原数组的顺序,即这个窗口要包含此时入的数据,需要left出队列即left++;left++;//由于每次入队列的数据都进行判断故最大数据个数为k+1,只需要移动一次所以用if而不是while}ret[(*returnSize)++]=nums[queue[left]];   }return ret;
}


http://www.ppmy.cn/server/100460.html

相关文章

HarmonyOS应用开发者基础认证(二)

1、下面是ArkTS中常量名、枚举值名推荐的代码风格是&#xff1f; 答案&#xff1a; 全大写&#xff0c;下划线分割 分析&#xff1a;常量名、枚举值名采用全部大写&#xff0c;单词间使用下划线隔开。 const MAX_USER_SIZE 10000; enum UserType {TEACHER 0,STUDENT 1 };2、…

深入探究:IP到TCP/IP堆栈的详尽旅程

在互联网的世界里&#xff0c;数据的每一次旅行都是一个复杂而精妙的过程&#xff0c;涉及到TCP/IP协议栈的每一层。让我们一起深入探讨&#xff0c;从IP层开始&#xff0c;直到数据被应用程序接收的全过程。 **一、网络层&#xff1a;IP的使命** IP&#xff08;Internet Prot…

代码规范 —— QMQ 开发规范

优质博文&#xff1a;IT-BLOG-CN 一、代码规范 【1】消费者必须以Consumer结尾&#xff0c;生产者必须以Producer结尾。 【2】选择合适的消费模式&#xff1a;根据业务判断消费模式是集群模式还是广播模式&#xff0c;具体为&#xff1a;MessageConsumerProvider.addListene…

LeetCode面试题Day9|LeetCode58 最后一个单词的长度、LeetCode151 反转字符串中的单词

题目1&#xff1a; 指路&#xff1a; . - 力扣&#xff08;LeetCode&#xff09;58 最后一个单词的长度 思路与分析&#xff1a; 求最后一个单词的长度&#xff0c;最普遍的思路应该是从后往前遍历&#xff0c;定义一个计数器&#xff0c;遇到第一个非空格的字母则使计数器…

05 数据类型

目录 分类数值类型小数类型字符串类型日期和时间类型集合类型 1. 分类 2. 数值类型 tinyint create table t1 (num tinyint); insert into t1 values (1); insert into t1 values (128); – 越界插入&#xff0c;报错 select * from t1; 说明: 在mysql中&#xff0c;整形可以指…

【Redis进阶】缓存设计模式

目录 Cache Aside&#xff08;旁路缓存&#xff09;模式 概念 读操作流程如上图所示 写操作流程如上图所示 代码示例 总结 Read-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Write-Through 模式 概念 操作流程&#xff1a; 优点&#xff1a; Writ…

基于Python的上市公司年报数字化词频统计:深入解析与实战

基于Python的上市公司年报数字化词频统计:深入解析与实战 随着数字化转型的不断深入,各行各业纷纷利用数据分析技术获取竞争优势。上市公司的年报作为重要的信息披露文件,包含了大量的文字数据。通过文本分析技术,特别是词频统计,可以有效地挖掘出其中隐含的趋势和关键信…

重写的介绍

一、基本介绍 1、基本介绍 重写又称为覆盖(override)&#xff0c;即子类继承父类的属性和方法后&#xff0c;根据业务需求&#xff0c;再重新定义同名的属性或方法 2、案例演示 二、练习 class Person:nameNoneageNonedef __init__(self,name,age):self.namenameself.ageage…