题解 | #滑动窗口的最大值#

package main

/**
 *
 * @param num int整型一维数组
 * @param size int整型
 * @return int整型一维数组
 */
/*
*
本质:使用双向队列
双向队列保存的是当前窗口中最大值的索引序号。(双向队列中保存的最大值都是单调递减的)
如果移动了窗口,就需要移除双向队列头部的数据,将头部索引值小于当前窗口右边索引的元素全部移除。
*/
func maxInWindows(num []int, size int) []int {
	//结果
	res := make([]int, 0)
	//存放的是数据的索引位置
	deque := make([]int, 0)
	//窗口大于数组、窗口为0
	if size > len(num) || size == 0 {
		return nil
	}
	//先填充一次双向队列,0~size范围
	for i := 0; i < size; i++ {
		//将当前遍历num的数值和双向队列尾部数值对比,剔除较小的值
		for len(deque) != 0 && num[deque[len(deque)-1]] < num[i] {
			deque = deque[:len(deque)-1]
		}
		//将当前遍历的数值放到双向队列末尾
		deque = append(deque, i)
	}
	//获取最大值
	res = append(res, num[deque[0]])
	//开始移动窗口
	for i := size; i < len(num); i++ {
		//移动窗口后,剔除双向队列中头部无效值
		for len(deque) != 0 && deque[0] < i-size+1 {
			deque = deque[1:]
		}
		//将当前遍历num的数值和双向队列尾部数值对比,剔除较小的值
		for len(deque) != 0 && num[deque[len(deque)-1]] < num[i] {
			deque = deque[:len(deque)-1]
		}
		//将当前遍历的数值放到双向队列末尾
		deque = append(deque, i)
		//获取最大值
		res = append(res, num[deque[0]])
	}
	return res
}

全部评论

相关推荐

07-29 14:09
门头沟学院 Java
我爱o泡我爱o泡o泡果奶ooo
26加瓦鼠鼠:三个offer了,停手吧,回头是岸
OPPO泡池子110人在聊
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-24 13:36
点赞 评论 收藏
分享
DKS233:(1)专业技能:Java8也太旧了,最少也要了解到JDK17吧,可以参考现在SpringBoot支持的Java最低版本,熟悉mysql基本理论具体指啥,是锁这种具体原理还是分库分表这些业务场景,spring这些专业词汇,大小写要写对(全篇简历都有这个问题,显得不严谨),熟悉使用框架进行业务开发就别写了,如果要写,起码要写到框架原理部分吧,比如aop,启动原理什么的,springcloud具体指哪些模块呢,写清楚,网关还是鉴权还是什么,“改造”没必要写吧,你直接说用springcloud开发的不就行了(2)项目经历:首先格式就有大问题,时间怎么能换行呢,调整一下,响应速度那个,如果指的是将部分数据从其他数据库转到redis的提升就别写了,因为这个不算难点,redis可以写写分布式这些,比如容灾怎么实现的,数据库同步怎么做的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务