题解 | #滑动窗口的最大值#
滑动窗口的最大值
http://www.nowcoder.com/practice/1624bc35a45c42c0bc17d17fa0cba788
思路:
1.如果这次窗口最右边的值num[right]大于等于上一次的max值,则令max=num[right];
2.否则如果这次num[right]小于上一次的max,
1)如果上一次窗口最左边的值恰好是max,则需要重新对整个窗口计算最大值。
2)如果不是的话,则这次窗口的最大值依然是上次窗口的最大值max
3.令此次窗口最大值为max,并加入到list中。
public ArrayList<Integer> maxInWindows(int [] num, int size) { ArrayList<Integer> list=new ArrayList<>(); if(size==0 ||size>num.length){ return list; } int left=0;//窗口最左边 int right=size-1;//窗口最右边 int max=getMax(num,left,right);//整个窗口的最大值 list.add(max);//把最大值加入到list left++;//窗口右移 right++; while(right<num.length){ //如果这次窗口最右边的值num[right]大于等于上一次的max值,则令max=num[right]; if(num[right]>=max){ max=num[right]; }else{//否则如果这次num[right]小于上一次的max if(max==num[left-1]){//如果上一次窗口最左边的值恰好是max,此时最大值不明了,重新计算。 max=getMax(num,left,right); } } list.add(max); left++; right++; } return list; } //计算窗口内的最大值 public int getMax(int[] num,int l,int h){ int max=num[l]; for(int i=l+1;i<=h;i++){ if(num[i]>max){ max=num[i]; } } return max; }