滑动窗口的最大值
2016-04-17 15:09
190 查看
题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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,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]}。
import java.util.ArrayList; import java.util.Deque; import java.util.LinkedList; /** * 滑动窗口的最大值 * * @author 过路的守望 * */ public class MaxWindowNum { public ArrayList<Integer> maxInWindows(int[] num, int size) { ArrayList<Integer> list = new ArrayList<Integer>(); if(num == null||num.length == 0||size<=0||size>num.length){ return list; } /* * 存放可能为最大值元素的下标 */ Deque<Integer> deque = new LinkedList<Integer>(); for(int i = 0;i<size;i++){ /* * 当前值比队列中元素值大 ,队列中下标无效删除 */ while(!deque.isEmpty()&&num[i]>num[deque.peekLast()]){ deque.pollLast(); } deque.offerLast(i); } for(int i = size;i<num.length;i++){ /* * 添加上一个滑动窗口的最大值 */ list.add(num[deque.peekFirst()]); /* * 当前值比队列中元素值大 ,队列中下标无效删除 */ while(!deque.isEmpty()&&num[i]>num[deque.peekLast()]){ deque.pollLast(); } /* * 队列中的第一个下标值不在滑动窗口范围,删除 */ if(!deque.isEmpty()&&deque.peekFirst()<i-size+1){ deque.pollFirst(); } /* * 添加当前下标 */ deque.offer(i); } list.add(num[deque.peekFirst()]); return list; } }
相关文章推荐
- 收集的MySQL的面试题分享给大家
- jquery_lazyload插件
- EntityFramework6 快速入门教程
- 关于lua的#
- 时间序列分析
- 如果看了这篇文章还不懂卷积,那就过来掐死我吧
- (2.2.6.2)构建工具Ant(一)—入门
- 基于MATLAB的QPSK通信系统
- js实现鼠标监听
- JS中取二维数组中最大值的方法汇总
- Error running Tomcat8: Address localhost:1099 is already in use
- 排序命令: sort,uniq,wc
- hdu 1031 Design T-Shirt
- Oracle--触发器
- jquery-fullpage插件
- 用两个栈实现队列
- initrd简介
- Nginx+Tomcat+Memcached+kryo序列化集群Session共享
- (2.2.6.1)Ant入门基础教程
- 第八周项目一(1) 数组做数据成员(工资类2 指针做法)