golang剑指offer-009.滑动窗口最大值

在处理滑动窗口这一类问题时,有一种很好的解决办法,那就是使用双端队列

什么是双端队列
双端队列是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出或者插入。

那么具体该如何使用呢?
对于这一类问题,有两点需要注意:

  • 双端队列中的元素个数是有限制的,一定要保证个数不能大于窗口大小 k k k

  • 要保证双端队列的第一个值是当前队列中最大的

根据逻辑进行思路整理,同时要保证必须满足上述的两个条件:

func maxSlideingWindow(nums []int, k int) []int {
	// 使用双端队列
	var result = make([]int, 0)
	var tmp = make([]int, 0)
	for i:=0; i<len(nums); i++ {
		// 最大值已经超出窗口范围
		if i >= k && tmp[0] <= i - k {
			tmp = tmp[1:]
		}
		// 当前值比队列其他值大就将其他值删除
		for len(tmp) > 0 && nums[tmp[len(tmp)-1]] < nums[i] {
			tmp = tmp[:len(tmp) - 1]
		}
		// 将当前元素加入到队列中
		tmp = append(tmp, nums[i])
		if i >= k - 1 {
			// 放入结果数组中
			result = append(result, tmp[0])
		}
	}
	return result
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值