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

滑动窗口的最大值

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

相关推荐

11-08 16:53
门头沟学院 C++
投票
滑模小马达:第三个如果是qfqc感觉还行,我签的qfkj搞电机的,违约金也很高,但公司感觉还可以,听说之前开过一个试用转正的应届生,仅供参考。
点赞 评论 收藏
分享
评论
1
收藏
分享
牛客网
牛客企业服务