LeetCode—239. 滑动窗口最大值(困难)

239. 滑动窗口最大值(困难)

题目描述:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。

返回滑动窗口中的最大值 。

考察重点:维护一个队列,队列元素由大到小排列,队头为窗口最大元素

/**
	golang中自带的list数据结构
	l := list.New()
	//取头部和尾部
	l.Front()
	l.Back()
    // 尾部添加
    l.PushBack("canon")
    // 头部添加
    l.PushFront(67)
    // 尾部添加后保存元素句柄
    element := l.PushBack("fist")
    // 在fist之后添加high
    l.InsertAfter("high", element)
    // 在fist之前添加noon
    l.InsertBefore("noon", element)
    // 使用
    l.Remove(element)
*/
func maxSlidingWindow(nums []int, k int) []int {
	que := list.New()
	lennum := len(nums) - k + 1
	res := make([]int, lennum)
	for i, p := 0, 0; i < len(nums); i++ {
		for que.Len() != 0 && nums[que.Back().Value.(int)] < nums[i] {
			que.Remove(que.Back())		//小于 nums[i]的全部出队
		}
		que.PushBack(i)		// 目前索引加入队列
		if i - que.Front().Value.(int) + 1 > k {		// 当目前索引与队首元素相距大于k,说明已经不在一个滑动窗口中,则移除队首元素(每次只向后1位,所以只需判断和队首元素的差距)
			que.Remove(que.Front())
		}
		if i >= k-1 {		// 当 目前索引 达到了滑动窗口大小时,就可以开始记录每次的最大值了
			res[p] = nums[que.Front().Value.(int)]
			p ++
		}
	}
	return res
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ostrich5yw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值