news 2026/6/10 20:51:17

go栈与队列之窗口最大值

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go栈与队列之窗口最大值

力扣题目链接:

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] }
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 14:52:46

Qwen3-0.6B语音助手集成:实时响应部署优化案例

Qwen3-0.6B语音助手集成&#xff1a;实时响应部署优化案例 1. 为什么是Qwen3-0.6B&#xff1f;轻量、快响、够用 你有没有遇到过这样的场景&#xff1a;想在边缘设备上跑一个能听会说的AI助手&#xff0c;但模型一加载就卡住&#xff0c;语音识别延迟三秒起步&#xff0c;用户…

作者头像 李华
网站建设 2026/6/10 14:52:40

Zotero插件茉莉花:让中文文献管理效率提升3倍的效率工具

Zotero插件茉莉花&#xff1a;让中文文献管理效率提升3倍的效率工具 【免费下载链接】jasminum A Zotero add-on to retrive CNKI meta data. 一个简单的Zotero 插件&#xff0c;用于识别中文元数据 项目地址: https://gitcode.com/gh_mirrors/ja/jasminum 中文文献管理…

作者头像 李华
网站建设 2026/6/10 19:46:09

3分钟上手的B站视频备份工具:为什么它比插件更好用?

3分钟上手的B站视频备份工具&#xff1a;为什么它比插件更好用&#xff1f; 【免费下载链接】BilibiliVideoDownload 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliVideoDownload B站视频下载已成为内容创作者和爱好者的刚需功能&#xff0c;但面对繁杂的插件…

作者头像 李华
网站建设 2026/6/10 15:10:39

无限滚动与数据表的结合:实战React Table组件

在现代Web开发中,处理大量数据是常见的挑战之一。特别是在用户需要浏览或操作大量数据时,如何高效地加载和展示这些数据成为一个关键问题。本文将通过一个实例,展示如何结合React Table组件和无限滚动功能来创建一个流畅的数据列表界面。 背景介绍 React Table是一款强大的…

作者头像 李华
网站建设 2026/6/10 11:02:50

磁盘空间不足解决方案:从诊断到优化的完整指南

磁盘空间不足解决方案&#xff1a;从诊断到优化的完整指南 【免费下载链接】WindowsCleaner Windows Cleaner——专治C盘爆红及各种不服&#xff01; 项目地址: https://gitcode.com/gh_mirrors/wi/WindowsCleaner 问题诊断&#xff1a;3个维度识别磁盘空间危机 痛点直…

作者头像 李华
网站建设 2026/6/10 1:04:09

Speech Seaco Paraformer用户手册精要:最常用功能快速上手指南

Speech Seaco Paraformer用户手册精要&#xff1a;最常用功能快速上手指南 1. 这是什么&#xff1f;一句话说清它的价值 Speech Seaco Paraformer 是一个开箱即用的中文语音识别&#xff08;ASR&#xff09;工具&#xff0c;它不是从零搭建的实验项目&#xff0c;而是基于阿里…

作者头像 李华