剑指offer——滑动窗口的最大值
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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 import java.util.ArrayList; 2 public class Solution { 3 public ArrayList<Integer> maxInWindows(int [] num, int size) 4 { 5 ArrayList<Integer> list=new ArrayList<>(); 6 int max=Integer.MIN_VALUE; 7 int maxindex=-1; 8 if(size==0) 9 return list; 10 for(int i=0;i<num.length-size+1;i++){ 11 //判断是否在本次窗口内 12 if(maxindex<i){ 13 max=Integer.MIN_VALUE; 14 //遍历窗口,得到最大值 15 for(int j=i;j<i+size;j++){ 16 if(num[j]>max){ 17 //保存最大值 18 max=num[j]; 19 //保存最大值的下标 20 maxindex=j; 21 } 22 } 23 }else{ 24 //窗口的最后一位数和旧最大值比较 25 if(num[i+size-1]>max){ 26 max=num[i+size-1]; 27 maxindex=i+size-1; 28 } 29 } 30 list.add(max); 31 } 32 return list; 33 } 34 }