2026/4/6 10:56:20
网站建设
项目流程
可信网站行业验证必须做吗,下载一个手机app,wordpress 视频广告,1800做网站因为专业力扣题目链接#xff1a;
239. 滑动窗口最大值 - 力扣#xff08;LeetCode#xff09;
题目描述#xff1a;
给你一个整数数组 nums#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移…力扣题目链接239. 滑动窗口最大值 - 力扣LeetCode题目描述给你一个整数数组nums有一个大小为k的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的k个数字。滑动窗口每次只向右移动一位。返回滑动窗口中的最大值。示例 1输入nums [1,3,-1,-3,5,3,6,7], k 3输出[3,3,5,5,6,7]解释滑动窗口的位置 最大值 --------------- ----- [1 3 -1] -3 5 3 6 731 [3 -1 -3] 5 3 6 731 3 [-1 -3 5] 3 6 751 3 -1 [-3 5 3] 6 751 3 -1 -3 [5 3 6] 761 3 -1 -3 5 [3 6 7]7这道题很适合用单调队列来写这样外面很容易通过一侧的值就知道最大值了。什么是单调队列其实就是单调递增或单调递减队列。那么就用单调递减队列来设计吧。单调递减队列是左边队列出口处的值最大所以窗口最大值就是索引0处通过队列的pop和push函数来设计吧。最开始的滑动窗口值只能用push函数通过它让我们的队列成单调递减那么我们先设计push函数。例单减数列 出口处 9 8 7 4 入口处当要进来的元素比入口处元素大时进来后就不成单减队列了所以要先比较把比他大的元素都弹出然后再将该元素加入队列再设计pop函数由刚才的push函数设计就知道队列里面的元素个数不一定等于滑动窗口里的元素个数。所以队列的元素个数一定小于等于滑动窗口元素个数。那么我们就不用每次pop都一定弹出元素。所以我们要弹出的元素等于出口处元素时才需要弹出元素。现在就设计完成了单调队列之后就很容易了完整代码func MaxSlidingWindow(nums []int, k int) []int { myque : make(queue, 0) result : make([]int, 0) //初始窗口 for i : 0; i k; i { myque.push(nums[i]) } //初始窗口值 result append(result, myque.front()) for i : k; i len(nums); i { myque.pop(nums[i-k]) //移除前面的元素 myque.push(nums[i]) //添加新的元素 result append(result, myque.front()) } return result } // 单调队列(由大到小) type queue []int // 比入口元素大的就弹出元素直到比它小 func (s *queue) push(x int) { for len(*s) 0 x (*s)[len(*s)-1] { *s (*s)[:len(*s)-1] //弹出入口元素 } *s append(*s, x) } // 若移除的元素等于出口元素就弹出 func (s *queue) pop(x int) { if len(*s) 0 x (*s)[0] { *s (*s)[1:] } } // 返回窗口最大值 func (s *queue) front() int { return (*s)[0] }