码迷,mamicode.com
首页 > 其他好文 > 详细

滑动窗口的最大值

时间:2015-12-06 14:30:46      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

package Solutions;
import java.util.ArrayDeque;
import java.util.ArrayList;
/**
* Created by hu on 2015/12/6.
*/
/*
*题目描述
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。
例如,如果输入数组{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]}。
* */
public class solution25 {
public ArrayList<Integer> maxInWindows(int [] num, int size) {
//存放最终结果的list
ArrayList<Integer> arrayList=new ArrayList<Integer>();
ArrayDeque<Integer> deque = new ArrayDeque<Integer>();
//首先初始化队列,队列存储的是元素的下标,其顺序按照对应的元素从大到小排列
if (size==0){
return arrayList;
}
//滑动窗口的起始位置
int begin;
for (int i=0;i<num.length;i++){
//i代表的是滑动窗口中最后一个元素的下标
begin=i-size+1;
if(deque.isEmpty()){
deque.add(i);
}else if(begin>deque.peekFirst()){
//如果最大值过期了,就将最大值去除掉,因为每次只移动一个格子,所以最多有一个元素过期,因此只判断一次
deque.pollFirst();
}
//将队列中小于新添加元素的下坐标都删除掉
while ((!deque.isEmpty())&&num[deque.peekLast()]<=num[i]){
deque.pollLast();
}
deque.add(i);
if(begin>=0){
arrayList.add(num[deque.peekFirst()]);
}
}
return arrayList;
}
}

滑动窗口的最大值

标签:

原文地址:http://www.cnblogs.com/hujingwei/p/5023561.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!