代码随想录刷题|LeetCode 239. 滑动窗口最大值 347.前 K 个高频元素(上)

简介: 代码随想录刷题|LeetCode 239. 滑动窗口最大值 347.前 K 个高频元素

239. 滑动窗口最大值

题目链接:力扣

思路

       这道题目暴力解法是很容易写出来的,但是暴力解法的时间复杂度为O(n*k)(n为遍历数组的长度,k为遍历滑动窗口的长度),会超出时间限制。

71296fb4231a4637b5caf4fe3735bac7.png

 所以我们需要降低时间复杂度,遍历数组是不可避免的,如果获取滑动窗口中的最大值时间复杂度为O(1)就可以了

       对于在加入的同时我们能求出最大值,首先可能想到的是优先队列,也就是大顶堆,但是滑动窗口的最大值是不断更新的,所以是不太适合的,要想整也是可以的,时间复杂度为O(n*logk)


       这里使用一种叫做单调队列的思想:对这道题目来说,希望这个队列中的数字一直是单调递减的,这样每次站在队头的就是最大值

       因为没有单调队列这样的数据结构,所以我们需要实现单调队列,对于这个题目:

               1、实现获取最大值的功能getMaxNum() -- 获取队列的队头就可以

               2、实现窗口的滑动poll() -- 移动窗口:①当移动窗口的时候,队头的值如果还是上一个窗口的第一个值(说明上一个滑动窗口的第一个值就是最大值)的时候,就需要将此数poll();②如果不是上一个窗口的第一个值,那说明已经被最大值干掉了,不进行操作,此时队列中的队头是除下一个窗口的最后一个数组的最大值

               3、实现窗口的添加push() -- 添加元素:因为我们要实现的是单调队列,所以在添加进去前要跟队列的元素进行比较,比待添加的元素要小的时候,就要将值弹出,因为这个队列是单调递减的,所以我们从队列的后面开始进行比较,如果小于就弹出,知道队列中的元素都比待添加的值大,再将元素添加进去


       将单调队列实现好之后我们就可以很好地比较窗口中的最大值了,其中getMaxNum()方法不用说,一直保持队头是最大值。

       poll()更多的是判断队头是不是上一个窗口的第一个元素,因为队列中要保持只有k个元素,这里有两种极端情况和一种常见情况,下图示例:


fede1c6263b84a37bf656ba54ff7cc86.png

push()方法做了比较的事,再加入队列的时候就进行比较,是保持队列窗口单调的关键,下图举一下例:


d7f6d157257c4841a855051ab7927b81.png


       上面两张图中基本就将所有情况都包含在内了,图和代码结合起来看更加清楚明了        

相关文章
|
4月前
【力扣】-- 移除链表元素
【力扣】-- 移除链表元素
51 1
|
5月前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4月前
【LeetCode 27】347.前k个高频元素
【LeetCode 27】347.前k个高频元素
52 0
|
3月前
|
机器学习/深度学习 人工智能 自然语言处理
280页PDF,全方位评估OpenAI o1,Leetcode刷题准确率竟这么高
【10月更文挑战第24天】近年来,OpenAI的o1模型在大型语言模型(LLMs)中脱颖而出,展现出卓越的推理能力和知识整合能力。基于Transformer架构,o1模型采用了链式思维和强化学习等先进技术,显著提升了其在编程竞赛、医学影像报告生成、数学问题解决、自然语言推理和芯片设计等领域的表现。本文将全面评估o1模型的性能及其对AI研究和应用的潜在影响。
99 1
|
5月前
|
数据采集 负载均衡 安全
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
本文提供了多个多线程编程问题的解决方案,包括设计有限阻塞队列、多线程网页爬虫、红绿灯路口等,每个问题都给出了至少一种实现方法,涵盖了互斥锁、条件变量、信号量等线程同步机制的使用。
LeetCode刷题 多线程编程九则 | 1188. 设计有限阻塞队列 1242. 多线程网页爬虫 1279. 红绿灯路口
|
4月前
【LeetCode 06】203.移除链表元素
【LeetCode 06】203.移除链表元素
41 0
|
4月前
【LeetCode-每日一题】移除元素
【LeetCode-每日一题】移除元素
40 0
|
6月前
|
存储 算法
LeetCode第83题删除排序链表中的重复元素
文章介绍了LeetCode第83题"删除排序链表中的重复元素"的解法,使用双指针技术在原链表上原地删除重复元素,提供了一种时间和空间效率都较高的解决方案。
LeetCode第83题删除排序链表中的重复元素
|
6月前
|
Python
【Leetcode刷题Python】剑指 Offer 32 - III. 从上到下打印二叉树 III
本文介绍了两种Python实现方法,用于按照之字形顺序打印二叉树的层次遍历结果,实现了在奇数层正序、偶数层反序打印节点的功能。
76 6
|
6月前
|
搜索推荐 索引 Python
【Leetcode刷题Python】牛客. 数组中未出现的最小正整数
本文介绍了牛客网题目"数组中未出现的最小正整数"的解法,提供了一种满足O(n)时间复杂度和O(1)空间复杂度要求的原地排序算法,并给出了Python实现代码。
145 2