窗口最大值问题
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组 {2,3,4,2,6,2,5,1} 及滑动窗口的大小3,那么一共存在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]},他们的最大值分别为{4,4,6,6,6,5}。
解决思路:
- 暴力方法。在每个窗口内都找到最大值,如果数组为n,窗口为m,那么时间复杂度为O(mn)。
import java.util.*; public class Main { public static void main(String[] args) { int[] array = new int[]{2, 3, 4, 2, 6, 2, 5, 1}; int slide = 3; ArrayList<Integer> list = new ArrayList<>(); for(int i = 0; i < array.length - 2; i++){ int max = array[i]; for(int j = i; j < i + 3; j++){ if(array[j] > max) max = array[j]; } list.add(max); } for (Integer e : list) { System.out.println(e); } } }
- 第二种解法是利用单调队列。从头到尾遍历数组时,根据如下的规则出队入队:
1)如果队列为空,则当前队列入队。
2)如果当前数字大于等于队列尾,则删除队列尾,知道当前数字小于队列尾部。
3)如果当前数字小于队列尾,则当前数字入队列
4)如果队列头超出滑动窗口范围,则删除队列头。
import java.util.*; public class Main { public ArrayList<Integer> slideWindow(int[] array, int w){ if(array == null || w < 1 || array.length < w) return null; ArrayList<Integer> result = new ArrayList<>(); LinkedList<Integer> queue = new LinkedList<>();//只保存数组的下标,便于判断比较与滑动窗口的大小 for(int i = 0; i < array.length; i++){ while (!queue.isEmpty() && array[i] >= array[queue.peekLast()]){ queue.pollLast(); } queue.addLast(i); //队列头超过滑动窗口的范围 if(i - w == queue.peekFirst()) queue.pollLast(); if(i >= w - 1) result.add(array[queue.peekFirst()]); } return result; } public static void main(String[] args) { int[] array = new int[]{3, 3, 2, 2}; int w = 3; ArrayList<Integer> res = new Main().slideWindow(array, w); for (Integer e:res) { System.out.println(e); } } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
JAVA基础知识
快速浏览 Sun公司在1991成立了一个名为Green的小组,这个小组开发了Oak,这正是java的前身,最初的开发目的是为了做家电的嵌入式应用,不过因为缺乏硬件市场的支持并没有受到大的关注。1995的时候,互联网开始崛起,这给了java机会。Sun公司首先推出了可以嵌入网页并且可以随同网页在网络上传输的Applet,并将Oak更名为Java。1996年1月,Sun公司发布了Java的第一个开发工具包,这个工具包被命名为JDK1.0,这标志着Java正式成为了一种独立的开发工具。1998年12月8日,第二代Java平台的企业版J2EE发布。1999年6月,Sun公司发布了第二代Java平台的第3个版本:J2ME。1999年4月27日,HotSpot虚拟机发布。HotSpot虚拟机发布时是作为JDK 1.2的附加程序提供的,后来它成为了JDK 1.3及之后所有版本的Sun JDK的默认虚拟机 。2000年5月,JDK1.3、JDK1.4和J2SE1.3相继发布,几周后其获得了Apple公司Mac OS X的工业标准的支持。2002年2月26日,J2SE1.4发布。自此Java的计算能力有...
- 下一篇
Spring+ Spring cloud + SSO单点登录应用认证
之前的文章中有介绍spring cloud sso集成的方案,也做过spring + jwt + redis的解决方案,不同系统的无缝隙集成,统一的sso单点登录界面的管理、每个应用集成的权限认证,白名单等都是我们需要考虑的,现在针对于以上的问题我们做了sso单点登录应用认证平台,设计如下: 数据库设计: DROP TABLE IF EXISTS `sso_app_apply`; CREATE TABLE `sso_app_apply` ( `id` varchar(200) NOT NULL COMMENT '编号', `type` varchar(200) NOT NULL COMMENT '所属分类', `applicant` varchar(200) NOT NULL COMMENT '申请人', `approver` varchar(200) NOT NULL COMMENT '审批人', `appname` varchar(200) NOT NULL COMMENT '应用名称', `range` varchar(200) NOT NULL COMMENT '使用范围', ...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2全家桶,快速入门学习开发网站教程
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2初体验,简单认识spring boot2并且搭建基础工程
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS8编译安装MySQL8.0.19
- Docker安装Oracle12C,快速搭建Oracle学习环境