算法-滑动窗口(滑动窗口中的最大值)
package com.jiucaiyuan.net.question; import java.util.LinkedList; /** * 滑动窗口结构及滑动窗口应用 * * @Author jiucaiyuan 2022/5/5 23:17 * @mail services@jiucaiyuan.net */ public class WindowMax { private int l; private int r; private int[] arr; // arr[ [l .. r) ] private LinkedList<Integer> qMax; //保存数组中的下标,尾部加入数据,头部获得最大值 public WindowMax(int[] a) { l = -1; r = 0; arr = a; qMax = new LinkedList<>(); } public void addNumFromRight(int num) { if (r == arr.length) { return; } //如果双端队列不为空,刚进入窗口的数大于等于双端队列尾部的数 while (!qMax.isEmpty() && arr[qMax.peekLast()] <= arr[r]) { qMax.pollLast(); } qMax.addLast(r); r++; } public void removeNumFromLeft() { if (l >= r - 1) { return; } l++; //如果头部是要出窗口的数字,弹出 if (arr[qMax.peekFirst()] == l) { qMax.pollFirst(); } } /** * 获取窗口内最大值 * 双端队列头到尾,单调递减 * * @return */ public Integer getMax() { if (!qMax.isEmpty()) { return arr[qMax.peekFirst()]; } return null; } //以上是滑动窗口的结构介绍 //以下是本体的解题代码 /** * <pre> * 【题目】 * 有一个整形数组arr和一个大小为w的窗口,窗口从最左边滑到最右边, * 窗口每次向右滑动一个位置。 * 例如:数组为[4,3,5,4,3,3,6,7],窗口大小为3时: * [4,3,5,]4,3,3,6,7 * 4,[3,5,4,]3,3,6,7 * 4,3,[5,4,3,]3,6,7 * 4,3,5,[4,3,3,]6,7 * 4,3,5,4,[3,3,6,]7 * 4,3,5,4,3,[3,6,7] * 窗口中最大值为5 5 5 4 6 7 * 如果数组长度为n,窗口大小为w,则一共产生n-w+1个窗口最大值 * 请实现一个函数,输入整形数组arr,和窗口大小w,输出一个长度为n-w+1的数组res, * res[i]表示每个窗口状态下的最大值, * 本例输出[5,5,5,4,6,7] * </pre> * * @param arr 待扫描的数组 * @param w 窗口大小 * @return 滑动过程中形成窗口中的最大值 */ public static int[] getMaxWindow(int[] arr, int w) { if (arr == null || w < 1 || arr.length < w) { return null; } //双端队列,存储下标,值从大到小的顺序 LinkedList<Integer> qmax = new LinkedList<>(); int[] res = new int[arr.length - w + 1]; int index = 0; for (int i = 0; i < arr.length; i++) { //当前入队时,要保证双端队列是单调递减的,从尾部加入,如果尾部元素<=当前值,出队 while (!qmax.isEmpty() && arr[qmax.peekLast()] <= arr[i]) { qmax.pollLast(); } qmax.addLast(i); if (qmax.peekFirst() == i - w) { // i-w 是过期的下标 qmax.pollFirst(); } if (i >= w - 1) { //形成窗口了 res[index++] = arr[qmax.peekFirst()]; } } return res; } }
日历
个人资料
diaba 寻求合作请留言或联系mail: services@jiucaiyuan.net
链接
最新文章
存档
- 2024年10月(1)
- 2024年8月(2)
- 2024年6月(4)
- 2024年5月(1)
- 2023年7月(1)
- 2022年10月(1)
- 2022年8月(1)
- 2022年6月(11)
- 2022年5月(6)
- 2022年4月(33)
- 2022年3月(26)
- 2021年3月(1)
- 2020年9月(2)
- 2018年8月(1)
- 2018年3月(1)
- 2017年3月(3)
- 2017年2月(6)
- 2016年12月(3)
- 2016年11月(2)
- 2016年10月(1)
- 2016年9月(3)
- 2016年8月(4)
- 2016年7月(3)
- 2016年6月(4)
- 2016年5月(7)
- 2016年4月(9)
- 2016年3月(4)
- 2016年2月(5)
- 2016年1月(17)
- 2015年12月(15)
- 2015年11月(12)
- 2015年10月(6)
- 2015年9月(11)
- 2015年8月(8)
分类
热门文章
- SpringMVC:Null ModelAndView returned to DispatcherServlet with name 'applicationContext': assuming HandlerAdapter completed request handling
- Mac-删除卸载GlobalProtect
- java.lang.SecurityException: JCE cannot authenticate the provider BC
- MyBatis-Improper inline parameter map format. Should be: #{propName,attr1=val1,attr2=val2}
- Idea之支持lombok编译
标签
最新评论
- logisqykyk
Javassist分析、编辑和创建jav... - xxedgtb
Redis—常见参数配置 - 韭菜园 ... - wdgpjxydo
SpringMVC:Null Model... - rllzzwocp
Mysql存储引擎MyISAM和Inno... - dpkgmbfjh
SpringMVC:Null Model... - tzklbzpj
SpringMVC:Null Model... - bqwrhszmo
MyBatis-Improper inl... - 乐谱吧
good非常好 - diaba
@diaba:应该说是“时间的度量依据”... - diaba
如果速度增加接近光速、等于光速、甚至大于...
最新微语
- 从今天起,做一个幸福的人。喂马,砍柴,(思想)周游世界
2022-03-21 23:31
- 2022.03.02 23:37:59
2022-03-02 23:38
- 几近崩溃后,找到解决方法,总是那么豁然开朗!所以遇到问题要坚持!
2018-07-18 10:49
- 2018年关键字“走心”
2018-03-19 16:07
- 保护好自己最大的方法是让自己更强大,不要柔弱的像一只绵羊一样,得谁巴拉,就谁巴拉!
2017-12-20 10:24
发表评论: