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

滑动窗口的最大值

http://www.nowcoder.com/questionTerminal/1624bc35a45c42c0bc17d17fa0cba788

这个题直接用滑动窗口每次找出窗口中的最大值是非常不理想的,必须做一些优化,我做的优化就是记住上次窗口的最大值和最大值所在的下表,下个窗口再决定要不要进行所有值比较大小。

import java.util.*;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size) {
        ArrayList<Integer> list = new ArrayList<>();
        if(size>num.length||num.length==0||size==0){
            return list;
        }
        int max = Integer.MIN_VALUE;
        int maxIndex = 0;
        for(int i = 0;i<size;i++){
            if(num[i]>max){
                max = num[i];
                maxIndex = i;
            }
        }
        list.add(max);
        int lastMax = max;
        int lastMaxIndex = maxIndex;
        for(int i = 1;i<num.length-size+1;i++){
            if(num[i+size-1]>=lastMax){
                list.add(num[i+size-1]);
                lastMaxIndex = i+size-1;
                lastMax = num[i+size-1];
            }else if(num[i+size-1]<lastMax&&lastMaxIndex>=i){
                list.add(lastMax);
            }else{//只有这个情况下才对窗口内所有值进行比较,否则可直接返回最大值
                int tempMax = Integer.MIN_VALUE;
                int tempIndex = Integer.MIN_VALUE;
                for(int j = i;j<i+size;j++){
                    if(num[j]>tempMax){
                        tempMax=num[j];
                        tempIndex = j;
                    }
                }
                list.add(tempMax);
                lastMax = tempMax;
                lastMaxIndex = tempIndex;
            }
        }
        return list;
    }
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
06-27 14:11
很喜欢小米的新车,校招薪资每月22k,攒多久能买?
测试糕手手:别看工资,先看现金流存款。有50W存款以上再考虑,车是消耗品,选适合自己的重要。你有钱就当我没说过
点赞 评论 收藏
分享
06-08 22:25
门头沟学院 Java
从零开始的转码生活:这hr不会打开手机不分青红皂白给所有人群发这句话,过一会再给所有人再发一遍,这肯定会有重复的,不管,再过一会再发一遍
点赞 评论 收藏
分享
代码飞升:别用口语,后端就写后端,前端就写前端,最后别光后悔
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务