239 滑动窗口最大值-困难
题目:
给你一个整数数组 nums,有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。
返回 滑动窗口中的最大值 。
解题思路
这道题可用滑动窗口解,且辅助优先队列。优先队列用于求窗口内的最大值。
这个问题是固定窗口大小,所以形成窗口不难,难在如何对窗口内的元素求最大值。
可以使用辅助数组,维护窗口内的递增子序列。每次新增元素的时候,用插入排序保证序列中比当前值小的元素都剔除。
一旦窗口形成,需要移除序列队头元素的时候,与窗口第一个元素进行判断。
// date 2023/11/20
func maxSlidingWindow(nums []int, k int) []int {
left, right := 0, 0
n := len(nums)
ans := make([]int, 0, 64)
priQueue := make([]int, 0, 16)
for right < n {
for len(priQueue) != 0 && nums[right] > priQueue[len(priQueue)-1] {
priQueue = priQueue[:len(priQueue)-1]
}
priQueue = append(priQueue, nums[right])
right++
if right - left >= k {
ans = append(ans, priQueue[0])
if priQueue[0] == nums[left] {
priQueue = priQueue[1:]
}
left++
}
}
return ans
}
最后更新于