[剑指Offer]59-队列的最大值(题目二待补)
2024-10-15 18:50:57
题目一:滑动窗口的最大值
题目链接
题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}
思路
总体思路:滑动窗口满足先进先出,可看作队列。因为两端都有pop操作,所以采用双端队列。
原则:
对于新来的元素m,将其与双端队列中的所有元素比较:
- 比m小的x,直接移出队列(因为不再能成为后面滑动窗口的最大值了。)
- 比m大的x,将两者下标差+1与滑动窗口大小比较,判断x是否已不再窗口内,若不在了,则直接移出队列。
经前面的操作,此时队列的第一个元素是滑动窗口的最大值。
由于上面的规则,队列中始终是由大至小的,所以上面两个移出操作分别从双端队列两端至内pop即可,这是采用双端队列的原因
时间复杂度O(n)。PS:暴力方法时间复杂度O(nk),其中k为滑动窗口大小。
其他思路
将滑动窗口看作队列,即是求队列的最大值问题。由于可以用O(1)得到栈的最大值,且可以用两个栈实现一个队列,所以也可以用O(1)的时间得到队列的最大值,故总时间复杂度降到了O(n)。但相比上面的方法,实现更复杂一些。
采用双端队列代码
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
vector<int> windowMax;
deque<int> dq;
if (num.size() != 0 && size <= num.size()) {
for (size_t numIndex = 0;numIndex < num.size();++numIndex) {//每个元素
while (!dq.empty()&&num[dq.back()]<=num[numIndex]) {
dq.pop_back();
}
while (!dq.empty() && numIndex - dq.front() + 1 > size) {
dq.pop_front();
}
dq.push_back(numIndex);
if (numIndex >= size - 1) {
windowMax.push_back(num[dq.front()]);
}
}
}
return windowMax;
}
};
最新文章
- 带交互的 iOS 产品原型可以用什么软件制作?
- iOS----ARC(自动内存管理)
- 网站flash黑屏问题
- Android中悬浮窗口
- Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’解决方法 + Linux启动/停止/重启Mysql数据库的方法
- MongoDB之【增加用户认证、增加用户、删除用户、修改用户密码、读写权限、只读权限】
- javascript 匿名函数的理解,js括号中括function 如(function(){})
- iOS学习之界面间传值
- CentOS7 citus9.5 集群安装及管理
- 励研(LY) CRC16算法
- 【算法系列学习三】[kuangbin带你飞]专题二 搜索进阶 之 A-Eight 反向bfs打表和康拓展开
- java testng框架的windows自动化-自动运行testng程序上篇
- Linux 学习目录
- Python中文繁简体转换工具
- JPA的初级CRUD-01
- SparkSql处理嵌套json数据
- vim常用命令总结(转)
- PostgreSQL入门教程
- React Native 错误锦集
- 根据ip,实现地址信息查询接口
热门文章
- 深度学习原理与框架-RNN网络框架-LSTM框架 1.控制门单元 2.遗忘门单元 3.记忆门单元 4.控制门单元更新 5.输出门单元 6.LSTM网络结构
- Redis脚本
- 130. Surrounded Regions 卧槽!我半梦半醒之间做出来的。
- python 中的比较==和is
- linux终端发送邮件
- CSS: Position Introduction.
- ReactiveX 学习笔记(5)合并数据流
- WebStorm新创建项目介绍
- winform中datagridview刷新后的排序记忆
- JSTL标签不起作用的解决办法