在线编程--生成窗口最大值数组
2016-04-04 17:11
260 查看
题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{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]}。
思路:利用双端队列实现更新。qmax是一个双端队列,,存放num数组的下标
遍历数组到num[i]时,qmax的规则为:
(1)如果qmax为空,直接把下标放入qmax队列,结束;
(2)如果qmax不为空,取出当前qmax队尾存放的下标,假设为j:
<1>如果num[j]>num[i],直接把下标放入qmax的队尾,结束;
<2>如果num[j]<=num[i],把j从qmax中弹出,继续qmax的存放规则。
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{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]}。
思路:利用双端队列实现更新。qmax是一个双端队列,,存放num数组的下标
遍历数组到num[i]时,qmax的规则为:
(1)如果qmax为空,直接把下标放入qmax队列,结束;
(2)如果qmax不为空,取出当前qmax队尾存放的下标,假设为j:
<1>如果num[j]>num[i],直接把下标放入qmax的队尾,结束;
<2>如果num[j]<=num[i],把j从qmax中弹出,继续qmax的存放规则。
import java.util.ArrayList; import java.util.LinkedList; public class Solution { public ArrayList<Integer> maxInWindows(int [] num, int size) { LinkedList<Integer> qmax=new LinkedList<Integer>(); ArrayList<Integer> res=new ArrayList<Integer>();//存放最后输出结果 if(num == null|| size<1 || num.length<size){ return res; } for(int i=0;i<num.length;i++){ while(!qmax.isEmpty()&&num[qmax.peekLast()]<num[i]){ qmax.pollLast(); //存大值下标,将大值存放入qmax靠前的位置 } qmax.addLast(i); if(qmax.peekFirst()==i-size){ qmax.pollFirst(); //超出队列所存放的size大小,去掉队列头 } if(i>=size-1){ res.add(num[qmax.peekFirst()]); //从滑动框大小处开始记录结果值(下标都是从0开始,故从size-1处开始存储) } } return res; } }
相关文章推荐
- POJ 3107 Godfather(树形DP)
- java下载文件
- python 第三库卸载办法
- 标准C语言关键知识回顾
- 设计模式C++生成器模式
- JVM内幕:Java虚拟机详解
- ubuntu14 配置java开发环境
- 机器学习算法的Python实现 (3):CART决策树与剪枝处理
- LeetCode 2 - Add Two Numbers ( JAVA )
- 深入理解java中的synchronized关键字
- java 数字证书生成及证书的加密解密
- Struts2 validation 错误信息重复不消失的问题
- python中的对象拷贝
- c++ int和string的互相转换
- ftp/sftp不使用webportal直接登录到目标系统设置文档-麒麟开源堡垒机技术文档之一
- 用php模拟做服务端侦听端口
- SpringMVC学习记录(二)--controller和view的联系
- 代码大全_第二部分: 创建高质量的代码
- javabean, ejb, entitybean的区别,以及POJO的概念
- 关于PHP