滑动窗口的最大值

烂漫一生 提交于 2020-02-06 03:11:36

该题考察滑动一数组框时,最大值的变化,我们可以使用双指针来进行滑动
灵感来自于LeetCode长度最小的子数组中的利用双指针将时间复杂度降为O(n),详情看代码

import java.util.ArrayList;
public class Solution {
    public ArrayList<Integer> maxInWindows(int [] num, int size)
    {
        ArrayList<Integer> arr=new ArrayList<>();
        //如果数组为零或者数组小于size,或者size为零,都是输出空链表
        if(num.length==0||size==0){
            return new ArrayList<Integer>();
        }
        if(num.length<size){
            return new ArrayList<Integer>();
        }
        //使用双指针进行计算,首先从第一个滑动模块开始,
        //设定标志位 stand,进行首次判断
        int begin=0;
        int end=size-1;
        int max=Integer.MIN_VALUE;
        int stand=0;
        for(int i=0;i<=size-1;i++){
            if(max<num[i]){
                max=num[i];
                stand=i;
            }
        }
        arr.add(num[stand]);
        begin++;
        end++;
        //跳出循环条件  end<num.length
        while(end<num.length){
            if(num[end]>max){
                max=num[end];
                stand=end;
            }
            //判断stand是否还在区间内,如果不在,则重新进行判断
            if(begin>stand){
                max=Integer.MIN_VALUE;
                for(int i=begin;i<=end;i++){
                    if(max<num[i]){
                        max=num[i];
                        stand=i;
                    }
                }
            }
            arr.add(num[stand]);
            begin++;
            end++;
            
        }
        //输出链表
        return arr;
        
    }
}
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!