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
}