滑动窗口最大值
题目描述:
给定一个数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回滑动窗口中的最大值。
来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/sliding-window-maximum 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路
优先队列保存入队元素的下标。
- 如果移动后,窗口范围超出队列最大元素,即队首,则移出队首。
- 对于一个需要入队的元素,先将队列中所有小于该值的元素移出。
- 元素入队。
code
func maxSlidingWindow(nums []int, k int) []int {
queue := make([]int, 0)
res := make([]int ,0)
for i, v := range nums {
if len(queue) > 0 {
// 移动后,最大值位置超出窗口范围,移除。
if i-k+1 > queue[0] {
queue = queue[1:]
}
// 如果不为空,将小于入队元素的移除。
for j, jv := range queue {
if nums[jv] < v {
queue = queue[:j]
break
}
}
}
// 元素入队
queue = append(queue, i)
// 偏移大于窗口,结果元素入队。
if i+1 >= k {
res = append(res, nums[queue[0]])
}
}
return res
}
坑:
// 如果不为空,将小于入队元素的移除。
for j, jv := range queue {
if nums[jv] < v {
queue = queue[:j]
break
}
}
这里的遍历队列移出小于值的元素时,当数组降序排序,且窗口大小等于数组大小时,最坏情况。O(n^2)