63 滑动窗口的最大值 &&front(),back()操作前一定要判断容器的尺寸不能为0
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。
思路:这道题感觉很难理解,先看的剑指offer,那上面很好理解,但是给出的代码很不懂,看下面的版本,使用双端队列deque,对队列和双端队列非常不懂,
queue的首先从左到右压入元素,最先压入的元素在右侧,叫队头使用front进行访问,最后push的元素使用back进行访问。
deque首先压入的元素也是在队头,使用front访问,压入使用pop_front,队尾使用back访问,压入队尾是pop_back。
访问里面的元素只能访问端口,不能使用迭代器进行访问。
front(),back()操作前一定要判断容器的尺寸不能为0
本题使用deque,结果存在数组里面,首先使用一个循环将队列中队首前面小于当前元素的都删除,队列里面存储的是元素下标,这样做的好处是可以很容易判断当前元素是否已经超出滑动窗口,这里是使用front,然后使用判断是否超出滑动窗口的尺寸,因为back元素是最先压入的,(pop_front压元素,back是最先压入的元素),所以if判断当前下标和back之间相差的个数是否大于滑动窗口*(首-尾+1),不管怎样,都需要将该元素压进去,然后判断,这里很难想到。最后因为前size元素是特殊情况,滑动窗口还没满,需要特殊处理。
class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size){
vector<int> res;
deque<int> s;
for(unsigned int i=;i<num.size();++i){
while(s.size() > && num[s.front()]<=num[i])
//如果队首元素小于当前元素,则弹出,不可能成为最大值
s.pop_front(); if(s.size() > && i-s.back()+>size)//front(),back()操作前一定要判断容器的尺寸不能为0
//back元素最先放进去的,所以和back的下标比较
s.pop_back();
s.push_front(i);//把每次滑动的num下标加入队列
if(size && i+>=size)//当滑动窗口首地址i大于等于size时才开始写入窗口最大值
res.push_back(num[s.back()]);
}
return res;
}
};
63 滑动窗口的最大值 &&front(),back()操作前一定要判断容器的尺寸不能为0的更多相关文章
- lintcode 滑动窗口的最大值(双端队列)
题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为 ...
- 剑指offer:滑动窗口的最大值
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值 ...
- 《剑指offer》第五十九题(滑动窗口的最大值)
// 面试题59(一):滑动窗口的最大值 // 题目:给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如, // 如果输入数组{2, 3, 4, 2, 6, 2, 5, 1}及滑动窗口的 ...
- 【剑指offer】滑动窗口的最大值,C++实现
原创博文,转载请注明出处! # 题目 # 思路 利用C++中的双端队列保存有可能是滑动窗口最大值的下标,其中队首元素保存当前窗口最大值的下标.当滑动窗口改变时,更新队列.队列更新的规则:(1)新元素依 ...
- 剑指offer64:滑动窗口的最大值
1 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4 ...
- 剑指0ffer59.滑动窗口的最大值
给定一个数组 nums 和滑动窗口的大小 k,请找出所有滑动窗口里的最大值. 示例: 输入: nums = [1,3,-1,-3,5,3,6,7], 和 k = 3输出: [3,3,5,5,6,7] ...
- 【Java】 剑指offer(59-1) 滑动窗口的最大值
本文参考自<剑指offer>一书,代码采用Java语言. 更多:<剑指Offer>Java实现合集 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例 ...
- 【Offer】[59-1] 【滑动窗口的最大值】
题目描述 思路分析 测试用例 Java代码 代码链接 题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2,3,4,2,6,2, 5,1}及滑动窗口的大小3,那 ...
- 剑指offer:滑动窗口的最大值(栈和队列)
1. 题目描述 /* 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值. 例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别 ...
随机推荐
- HDU4081 Qin Shi Huang's National Road System
先求最小生成树 再遍历每一对顶点,如果该顶点之间的边属于最小生成树,则剪掉这对顶点在最小生成树里的最长路径 否则直接剪掉连接这对顶点的边~ 用prim算法求最小生成树最长路径的模板~ #include ...
- Java面向对象内存图
1. java虚拟机的内存划分 2. 苹果手机类 package cn.itcast.day06.demo02; /* 定义一个类,用来模拟“手机”事物. 属性:品牌.价格.颜色 行为:打电话.发短信 ...
- mybatis实现有则更新无则插入
<insert id="insertUser" useGeneratedKeys="true" keyProperty="id" ke ...
- Sudo临时提权配置
目录 Sudo临时提权配置 参考 Sudo简介 Sudo配置文件 Sudo配置语法 Sudo配置实例 Sudo日志记录 Sudo临时提权配置
- GIT 协同开发
Git 是一个开源的分布式版本控制系统,用于敏捷高效的处理任何项目的版本问题.Git 是 Linus Torvalds 为了帮助管理 Linux 内核开发而开发的一个开放源码的版本控制软件.与cvs, ...
- PyQt5中Web操作与多线程定时器
1.装载外部网页页面'''用web浏览器控件QWebEngineView控件显示网页PyQt5和Web的交互技术 同时使用python和Web开发程序,混合开发 Python+JavaScript+H ...
- Docker for YApi--一键部署YApi
获取YApi镜像$ docker pull mrjin/yapi:latest 注意:本仓库目前只支持安装,暂不支持升级,请知晓.如需升级请备份mongoDB内的数据. docker-compose ...
- 【转载】IntelliJ IDEA配置JUnit进行单元测试
前提条件 安装JDK,并配置好环境变量 工程已解决JUnit依赖关系(pom.xml) IDEA中JUnit配置 IDEA自带一个JUnit插件,打开Settings窗口搜索junit,如图: 图 ...
- XCOJ1250: 语言战争
1250: 语言战争 时间限制: 1 Sec 内存限制: 64 MB提交: 203 解决: 46 标签提交统计讨论版 题目描述 llc和yrc语言的优劣一直都是大家所争论的焦点,但它们之间最大的区 ...
- Pandas的Categorical Data类型
pandas从0.15版开始提供分类数据类型,用于表示统计学里有限且唯一性数据集,例如描述个人信息的性别一般就男和女两个数据常用'm'和'f'来描述,有时也能对应编码映射为0和1.血型A.B.O和AB ...