题解 | #滑动窗口的最大值#

滑动窗口的最大值

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;
    }
全部评论

相关推荐

10-14 23:01
已编辑
中国地质大学(武汉) Java
CUG芝士圈:虽然是网上的项目,但最好还是包装一下,然后现在大部分公司都在忙校招,十月底、十一月初会好找一些。最后,boss才沟通100家,别焦虑,我去年暑假找第一段实习的时候沟通了500➕才有面试,校友加油
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
1 收藏 评论
分享
牛客网
牛客企业服务