题目描述:

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

  解题思路:

  如果不考虑时间开销,使用蛮力法,本题并不难解决,依次遍历所有的滑动窗口,扫描每个窗口中的所有数字并找出其中的最大值,这都很容易实现,但是如果滑动窗口的大小为k,那么需要O(k)的时间找最大值,对于长度为n大的数组,总的时间复杂度为O(nk)。

  然后我们考虑进一步优化,一个滑动窗口实际上可以看成一个队列。当窗口滑动时,处于窗口第一个位置的数字被删除,同时在窗口的末尾又增加了一个新的数字。这符合队列“先进先出”的特性。

  在第20题:包含min函数的栈,我们使用两个栈实现了一个求最小值的栈,在O(1)时间内可以得到最小值,这里我们可以改为求最大值,同样可以在O(1)时间内得到最大值,而这里的数据用队列保存,我们可以用两个栈实现队列,这就是第5题:用两个栈实现队列。这样,实际上综合这两题我们可以解决本题,总的时间复杂度也可以降到O(n)。

  这里我们换用另外一种方法:使用双端队列。我们不把所有的值都加入滑动窗口,而是只把有可能成为最大值的数加入滑动窗口。这就需要一个两边都可以操作的双向队列。

  我们以数组{2,3,4,2,6,2,5,1}为例,滑动窗口大小为3,先把第一个数字2加入队列,第二个数字是3,比2大,所以2不可能是最大值,所以把2删除,3存入队列。第三个数是4,比3大,同样删3存4,此时滑动窗口以遍历三个数字,最大值4在队列的头部。

  第4个数字是2,比队列中的数字4小,当4滑出去以后,2还是有可能成为最大值的,因此将2加入队列尾部,此时最大值4仍在队列的头部。

  第五个数字是6,队列的数字4和2都比它小,所以删掉4和2,将6存入队列尾部,此时最大值6在队列头部。

  第六个数字是2,此时队列中的数6比2大,所以2以后还有可能是最大值,所以加入队列尾部,此时最大值6在仍然队列头部。

  ······

  依次进行,这样每次的最大值都在队列头部。

  还有一点需要注意的是:如果后面的数字都比前面的小,那么加入到队列中的数可能超过窗口大小,这时需要判断滑动窗口是否包含队头的这个元素,为了进行这个检查,我们可以在队列中存储数字在数组中的下标,而不是数值,当一个数字的下标和当前出来的数字下标之差大于等于滑动窗口的大小时,这个元素就应该从队列中删除。

  举例:

  编程实现(Java):

import java.util.*;
public class Solution {public ArrayList<Integer> maxInWindows(int [] num, int size){/*思路:用双端队列实现*/ArrayList<Integer> res=new ArrayList<>();if(num==null || num.length<1 || size<=0 || size>num.length)return res;Deque<Integer> queue=new LinkedList<>();for(int i=0;i<num.length;i++){while(!queue.isEmpty() && queue.peek()<i-size+1) //超出范围的去掉queue.poll();//当前值大于之前的值,之前的不可能是最大值,可以删掉while(!queue.isEmpty() && num[i]>=num[queue.getLast()]) queue.removeLast();queue.add(i);if(i>=size-1){ //此时开始是第一个滑动窗口res.add(num[queue.peek()]);}}return res;}
}

滑动窗口的最大值java相关推荐

  1. java 滑动窗口_【Java】 剑指offer(59-1) 滑动窗口的最大值

    本文参考自<剑指offer>一书,代码采用Java语言. 题目 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值.例如,如果输入数组{2, 3, 4, 2, 6, 2, 5, 1 ...

  2. 剑指offer编程试题Java实现--64.滑动窗口的最大值

    个人博客:小景哥哥 64.滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在 ...

  3. 62、滑动窗口的最大值

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

  4. 【LeetCode】剑指 Offer 59 - I. 滑动窗口的最大值

    [LeetCode]剑指 Offer 59 - I. 滑动窗口的最大值 文章目录 [LeetCode]剑指 Offer 59 - I. 滑动窗口的最大值 package offer;import ja ...

  5. 剑指offer:滑动窗口的最大值(栈和队列)

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

  6. lintcode 滑动窗口的最大值(双端队列)

    题目链接:http://www.lintcode.com/zh-cn/problem/sliding-window-maximum/# 滑动窗口的最大值 给出一个可能包含重复的整数数组,和一个大小为  ...

  7. 《剑指offer》-- 序列化二叉树、二叉搜索树的第k个节点、数据流中的中位数、滑动窗口的最大值

    一.序列化二叉树: 1.题目: 请实现两个函数,分别用来序列化和反序列化二叉树. 2.解题思路: (1)根据前序遍历规则完成序列化与反序列化.所谓序列化指的是遍历二叉树为字符串:所谓反序列化指的是依据 ...

  8. 牛客题霸 [滑动窗口的最大值] C++题解/答案

    牛客题霸 [滑动窗口的最大值] C++题解/答案 题目描述 给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值.例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一 ...

  9. 面试题59 - I. 滑动窗口的最大值/239. 滑动窗口最大值

    2020-05-11 1.题目描述 滑动窗口的最大值 2.题解 使用双端队列维护一个递减的队列 3.代码 class Solution { public:vector<int> maxSl ...

最新文章

  1. mono上运行程序常见问题
  2. Debain/ArchLinux/Gentoo 等将合并为超级Linux
  3. 如何设置GridView的内框线颜色
  4. 黑马程序员pink老师前端入门教程,零基础必看的JavaScript基础语法视频教程(jQuery1)
  5. 【BZOJ3328】PYXFIB【矩阵快速幂】【单位根反演】【二项式定理】
  6. saltstack php,Saltstack快速入门简单汇总
  7. 【图像重建指标 Metrics】均方误差RMSE及平均绝对误差MAE的定义和区别
  8. 西安工程大学c语言试卷,知到_大学应用写作_单元测试答案知到C语言程序设计(西安工程大学)见面课答案...
  9. ansys怎么使用anand模型_当SpaceClaim 遇上ANSYS
  10. 代码编辑框控件_某游戏控件遍历
  11. 什么是多态 重载 覆盖 继承 最好解释
  12. 配置mysql复制基本步骤
  13. 遗传算法求解立体仓库货位优化
  14. 台式计算机可以放到笔记本立马,怎么把台式电脑投影到笔记本电脑
  15. MuJoCo的机器人建模
  16. 国家信息系统安全等级保护基本要求——等保一级、二级、三级、四级内容
  17. mysql数据库中查询姓氏_数据库查询表添加姓氏
  18. System.Diagnostics.Process.Start 用法
  19. 自考哪些专业不考英语跟计算机,深圳自考有哪些专业?并且可以不考“数学”和“英语”!...
  20. 精通正则表达式学习记录 第一章 正则表达式入门

热门文章

  1. 使用IRP进行文件操作
  2. 编程之美2.1 求二进制中1的个数
  3. java实现异步调用实例
  4. 《Debug Hacks》和调试技巧
  5. 问题集锦(21-25)
  6. select, epoll的个人总结
  7. 昵图网学校计算机教室制度,ClassIn在线教室
  8. mysql 限定查询_MySQL Limit 限定查询记录数
  9. java list主要实现_java容器-list的常用实现及原理
  10. matlab如何求传递函数的幅值_自动控制原理2.2.1 什么是传递函数,为什么要使用传递函数的概念...