判断滑动窗口中的最大值

问题:

  给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。

分析:

  (1)建立滑动窗口,并初始化化。

  (2)动态更新窗口值:因为窗口是每一次只移动一位,所以每次只需要更新窗口内部指定的一位。计算当前更新值的位置:i %size,刚好等于每次需要被淘汰的值。

code:

 1  public ArrayList<Integer> maxInWindows(int [] num, int size) {
 2         ArrayList<Integer> list = new ArrayList<>();
 3         if(num==null || num.length==0){
 4             return list;
 5         }else if(size>=num.length){
 6             OptionalInt max = Arrays.stream(num).max();
 7             list.add(max.getAsInt());
 8             return list;
 9         }else{
10             int[] dp = new int[size];   //建立滑动窗口
11             //初始化滑动窗口
12             System.arraycopy(num,0,dp,0,size);
13             OptionalInt max = Arrays.stream(dp).max();
14             list.add(max.getAsInt());
15             //窗口移动
16             for(int i=size;i<num.length;i++){
17                 dp[i%size] = num[i]; //更新窗口
18                 max = Arrays.stream(dp).max();  //使用流获取最大值
19                 list.add(max.getAsInt());
20             }
21             return list;
22         }
23 
24 
25     }
原文地址:https://www.cnblogs.com/dream-flying/p/12931710.html