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