题解 | #滑动窗口的最大值#
滑动窗口的最大值
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;
}

