1. 题目描述

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

2. 思路

/*** 题目:滑动窗口的最大值* 思路:滑动窗口应当是队列,但为了得到滑动窗口的最大值,队列序可以从两端删除元素,因此使用双端队列。* 原则:*     对新来的元素c,将其与双端队列中的元素相比较*     1)后面(队列的尾部)比c小的x,直接移出队列(因为不再可能成为后面滑动窗口的最大值了!);*     2)前面(队列的头部)比c大的X,比较两者下标,判断X是否已不在窗口之内,不在了,直接移出队列;*     3)队列的第一个元素是滑动窗口中的最大值。*/

3. 代码

import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size) {if (num == null || num.length == 0 || size <= 0 || num.length < size) {return new ArrayList<Integer>();}ArrayList<Integer> result = new ArrayList<>();//双端队列,用来记录每个窗口的最大值下标LinkedList<Integer> qmax = new LinkedList<>();int index = 0;for (int i = 0; i < num.length; i++) {//若队列不为空且 队列最后一个元素<当前值, 因为它不再可能成为后面滑动窗口的最大值了while (!qmax.isEmpty() && num[qmax.peekLast()] < num[i]) {qmax.pollLast();}qmax.addLast(i);//判断队首元素是否过期while (qmax.peekFirst() <= i - size) {qmax.pollFirst();}//上面两个while保证了了队列头部第一个元素是每一个窗口的最大值//保存每一个窗口的最大值(注意:从size-1开始)if (i >= size - 1) {result.add(num[qmax.peekFirst()]);}}return result;}
}

转载于:https://www.cnblogs.com/haimishasha/p/11520681.html

剑指offer:滑动窗口的最大值(栈和队列)相关推荐

  1. 《LeetCode力扣练习》剑指 Offer 09. 用两个栈实现队列 Java

    <LeetCode力扣练习>剑指 Offer 09. 用两个栈实现队列 Java 一.资源 题目: 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 de ...

  2. java 栈和队列实现迷宫代码_LeetCode每日一题--剑指 Offer 09. 用两个栈实现队列(Java)

    DailyChallenge 剑指 Offer 09. 用两个栈实现队列 Easy20200630 Description 用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTai ...

  3. 【LeetCode】剑指 Offer 09. 用两个栈实现队列

    [LeetCode]剑指 Offer 09. 用两个栈实现队列 文章目录 [LeetCode]剑指 Offer 09. 用两个栈实现队列 一.双栈 总结 一.双栈 维护两个栈,第一个栈支持插入操作,第 ...

  4. 【剑指offer】 用两个栈实现队列 java实现

    [剑指offer] 用两个栈实现队列 题目: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 分析: 栈和队列的性质,栈是先进后出的,而队列是先进先出的.对于栈我 ...

  5. 剑指Offer #05 用两个栈实现队列(模拟)

    题目来源:牛客网-剑指Offer专题 题目地址:用两个栈实现队列 题目描述 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题目解析 首先,我们需要知道一下基本知 ...

  6. [剑指Offer]9.用两个栈实现队列

    题目 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 思路 用栈来模拟队列.我们首先插入一个元素a到stack1中,再压入两个元素bc,此时栈中有元素abc,其中 ...

  7. 剑指offer——9.用两个栈实现队列

    题目: 题1:用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 题2:用两个队列来实现一个栈,完成栈的add和remove操作. 栈中的元素为int类型 知识点: ...

  8. 剑指OFFER之用两个栈实现队列(九度OJ1512)

    题目描述: 用两个栈来实现一个队列,完成队列的Push和Pop操作. 队列中的元素为int类型. 输入: 每个输入文件包含一个测试样例. 对于每个测试样例,第一行输入一个n(1<=n<=1 ...

  9. 剑指offer笔记(九)栈和队列

    栈:先进后出 队列:先进先出 用栈实现队列 通过两个栈,利用先进后出的特性循环得到先进先出的特性 class MyQueue { public:stack<int> pushst;stac ...

  10. Leetcode 剑指 Offer 09. 用两个栈实现队列 (每日一题 20210915)

    用两个栈实现一个队列.队列的声明如下,请实现它的两个函数 appendTail 和 deleteHead ,分别完成在队列尾部插入整数和在队列头部删除整数的功能.(若队列中没有元素,deleteHea ...

最新文章

  1. 巨大的需求之下 人工智能如何更快落地?
  2. 并非所有图像都值16x16个词--- 清华华为提出一种自适应序列长度的动态ViT
  3. 【数据库系统】再谈关系模型和关系型数据库
  4. java解析字符串方法_java字符串的截取方法substring()代码解析
  5. 微信小程序——尤克里里和弦查询
  6. 管理新语:主管要辅导员工转正
  7. 计算机等级考试c 试题及答案,3月计算机等级考试级C笔试试题及答案解析.doc
  8. php 页面字体大小,CSS_做网页字体大小参考 网页中同字号字体的不同单位对比列表,对于WEB前端页面开发,字体大 - phpStudy...
  9. springboot实现图片验证码登录
  10. 【BLE-CC2640】CC2640之OLED
  11. 硬盘出现坏道以及处理方法
  12. Docker + Gitlab + Gitlab CI(三)
  13. python项目开发案例集锦 豆瓣-Python 的练手项目有哪些值得推荐?
  14. 升级Windows 10 22H2的五种方法
  15. Nginx 之实现原理
  16. C#,图像二值化(05)——全局阈值的联高自适应算法(Legal Self-Adaptive Thresholding)及其源代码
  17. linux下载大文件失败,Linux下FTP/SFTP传输大文件总是失败的处理办法
  18. 获取当前时间的后一天/前一天或者后1小时/前1小时
  19. Android手机连接笔记本电脑上网 linux环境
  20. 手机资费相关问题的解答

热门文章

  1. 在CKEditor中创建自己的命令按钮
  2. bootsect Linux,linux_bootsect选读.doc
  3. python语言的三种数字类型_Python语言中的类型之数字类型--Python(10)
  4. 计算机应用与软件修审,国中课室素养导向标准本位评量的设计与应用:以英语科阅读为例...
  5. Parameter ‘username‘ not found. Available parameters are [arg1, arg0, param1, param2] 绑定参数异常
  6. 小程序组件的使用(二) packer多选组件
  7. html目录参数加密,从HTML文件中取出JS加密需要的参数,并调用js内的加密算法
  8. android 插入gif,android – Gboard:在EditText上启用GIF插入
  9. matlab bdir 排序,matlab-3次b样条(matlab - 3次b样条).doc
  10. md5碰撞Java_什么是导致MD5碰撞的最短字符串?