题目描述

给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
 

解答:

用一个双端队列模拟当前的窗口。
首先队列维护非递增序,因为如果队列中有增序的数字,比如a,b,c为当前队列,有a<c。那么显然当前窗口中a一定不是最大值,并且a也不可能是之后某个窗口的最大值(因为c的索引在a之后,a先滑出窗口)。故a也就没有存储的必要。那么递减的数字为什么要存储呢?比如数组3,2,1,窗口大小k=2。那么起初的窗口为[3,2],队列为3,2。窗口右移一位,3被移出窗口,此时队列剩下2,由于1比2小故push,则队列中此时为2,1。那么如果之前不保存元素2,后面的窗口如果需要用到2(此例就用到了),便会出错。
 
模拟一个栗子以加深对滑动窗口的理解:
 
数组{2,3,4,2,6,2,5,1},窗口长度k=3
 
窗口[2,3,4],队列[4],实际是push2,pop2,push3,pop3,push4。
窗口[3,4,2],2<=4,所以push2,得队列[4,2]
窗口[4,2,6],6>2,pop2,此时队列[4],6>4,pop4,push6,得队列[6]
窗口[2,6,2],2<=6,所以push2,得队列[6,2]
窗口[6,2,5],5>2,pop2,此时队列[6],5<=6,push5,得队列[6,5]
窗口[2,5,1],由于6等于移出队列的元素,pop_front(6),此时队列[5],1<=5,push1,得队列[5,1]
 
每一步得到的队列的队首就是当前窗口的最大值,分别为4,4,6,6,6,5
 

代码:

队列存元素:

 class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
if(size== or num.size()<size){return {};}
int k=size;
deque<int> que;
vector<int> res;
int le=,ri=;
while(ri<num.size()){
while(ri-le<k){
while(not que.empty() and que.back()<num[ri]){
que.pop_back();
}
que.push_back(num[ri++]);//存元素
}
res.push_back(que.front());
le++;
if(que.front()==num[le-]){
que.pop_front();
}
}
return res;
}
};

队列中保存数组索引也可以:

 class Solution {
public:
vector<int> maxInWindows(const vector<int>& num, unsigned int size)
{
if(num.size()<size){return {};}
int k=size;
deque<int> que;
vector<int> res;
int le=,ri=;
while(ri<num.size()){
while(ri-le<k){
while(not que.empty() and num[que.back()]<num[ri]){
que.pop_back();
}
que.push_back(ri++);//存索引
}
res.push_back(num[que.front()]);
le++;
if(que.front()==le-){
que.pop_front();
}
}
return res;
}
};

剑指offer 面试题. 滑动窗口的最大值的更多相关文章

  1. 剑指 Offer 59 - I. 滑动窗口的最大值 + 双指针 + 双端队列

    剑指 Offer 59 - I. 滑动窗口的最大值 Offer_59_1 题目详情 方法一:暴力方法+双指针 package com.walegarrett.offer; /** * @Author ...

  2. 力扣 - 剑指 Offer 59 - I. 滑动窗口的最大值

    题目 剑指 Offer 59 - I. 滑动窗口的最大值 思路1(单调队列) 使用单调(递减)队列,保持队列中的元素是递减顺序,队列头保存的是当前窗口中最大的元素 首先先模拟建立第一个窗口,同时获取第 ...

  3. 剑指offer系列38----滑动窗口的最大值(不懂????????????????????????????????????????????????)

    [题目] 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6 ...

  4. 剑指Offer:面试题15——链表中倒数第k个结点(java实现)

    问题描述 输入一个链表,输出该链表中倒数第k个结点.(尾结点是倒数第一个) 结点定义如下: public class ListNode { int val; ListNode next = null; ...

  5. 剑指offer面试题3 二维数组中的查找(c)

    剑指offer面试题三:

  6. 剑指Offer——笔试题+知识点总结

    剑指Offer--笔试题+知识点总结 情景回顾 时间:2016.9.23 12:00-14:00 19:00-21:00 地点:山东省网络环境智能计算技术重点实验室 事件:笔试 注意事项:要有大局观, ...

  7. C++版 - 剑指offer之面试题37:两个链表的第一个公共结点[LeetCode 160] 解题报告

    剑指offer之面试题37 两个链表的第一个公共结点 提交网址: http://www.nowcoder.com/practice/6ab1d9a29e88450685099d45c9e31e46?t ...

  8. C++版 - 剑指offer 面试题23:从上往下打印二叉树(二叉树的层次遍历BFS) 题解

    剑指offer  面试题23:从上往下打印二叉树 参与人数:4853  时间限制:1秒  空间限制:32768K 提交网址: http://www.nowcoder.com/practice/7fe2 ...

  9. C++版 - 剑指offer 面试题39:判断平衡二叉树(LeetCode 110. Balanced Binary Tree) 题解

    剑指offer 面试题39:判断平衡二叉树 提交网址:  http://www.nowcoder.com/practice/8b3b95850edb4115918ecebdf1b4d222?tpId= ...

随机推荐

  1. 数据库MySQL中关于“多表关联更新”的那些事

    在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...

  2. Docker入门(windows安装)

    Docker入门(安装)Docker是一种轻量级容器技术,实际中直接运行在当前操作系统(Linux)上,而不是虚拟机中.PaaS提供了存储,数据库,网络,负载均衡,自动扩展等功能,Docker云平台就 ...

  3. salt 安装 以及salt-api使用

    salt--master    和 salt-minion 控制端 被控制端 通过 salt-api 访问 salt-master  来控制salt-minion 执行 命令  返回结果 LINUX ...

  4. 嵊州D5T3 指令 program 神奇的位运算

    指令 program [问题描述] krydom 有一个神奇的机器. 一开始,可以往机器里输入若干条指令: opt x 其中,opt 是 & | ^ 中的一种,0 ≤ x ≤ 1023 . 对 ...

  5. Android_AsyncTask异步类

    ·AsyncTask是一个轻量级的异步抽象类 ·Android程序刚启动时,会同时启动一个像一个的主线程,这个主线程主要负责处理与UI有关的事件,有时也被称为UI线程,Android app中必须遵循 ...

  6. PTA 1001 A+B Format

    问题描述: Calculate a+b and output the sum in standard format -- that is, the digits must be separated i ...

  7. AI 数学基础 : 熵

    什么是熵(entropy)? 1.1 熵的引入 事实上,熵的英文原文为entropy,最初由德国物理学家鲁道夫·克劳修斯提出,其表达式为: 它表示一个系系统在不受外部干扰时,其内部最稳定的状态.后来一 ...

  8. C# LINQ学习笔记一:走进LINQ的世界

    本笔记摘抄自:https://www.cnblogs.com/liqingwen/p/5832322.html,记录一下学习过程以备后续查用. LINQ 简介:     语言集成查询(LINQ)是Vi ...

  9. C#中怎样将数组的顺序打乱随机排序

    场景 在ZedGraph随机生成颜色时需要从颜色数组中取颜色对象. Color数组存取的是System.Drawing.Color的颜色. 其顺序是相邻的颜色,颜色差距不大,在取颜色时按顺序取颜色时, ...

  10. 主机名由localhost变成bogon是怎么回事,怎样变回localhost这个名字?

    如何解决这个问题修改你的 DNS 为公共 DNS,例如 114.114.114.114 或者谷歌的 8.8.8.8.然后修改你的主机名: sudo hostname localhost 出现这个问题的 ...