在处理滑动窗口这一类问题时,有一种很好的解决办法,那就是使用双端队列。
什么是双端队列?
双端队列是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出或者插入。
那么具体该如何使用呢?
对于这一类问题,有两点需要注意:
-
双端队列中的元素个数是有限制的,一定要保证个数不能大于窗口大小 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
}