生成窗口最大值数组

整型数组arr, 滑动窗口大小w, 窗口从左向右滑动,依次输出窗口内最大值

如数组为[3,5,6,2,3,4], 滑动窗口大小:2   

则输出[5,5,6,3,4]

public class MaxArray {
    public static void main(String[] args){
        int[] arr = {6,6,8,5,9,3,3,6,7};
        int[] output = max_way(arr, 3);
        for(int i=0; i< output.length; i++){
            System.out.print(arr[output[i]] + ",");
        }

    }
    public static int[] max_way(int[] arr, int num){
        //排查条件之外的情况
        if(arr ==null || num<1 ||arr.length<num){
            return arr;
        }
        //初始化需要返回的数组
        int[] res = new int[arr.length - num +1];
        //新建一个双端队列,用于存放最大值,注:始终保持队首在滑动框内为最大值
        LinkedList<Integer> max_value = new LinkedList<Integer>();
        int index = 0;
        for(int i=0; i<arr.length; i++){
              while(!max_value.isEmpty() &&  arr[max_value.peekLast()]<=arr[i]){
                    max_value.pollLast();
              }
              max_value.addLast(i);
              if(max_value.peekFirst() == i-num){
                  max_value.pollFirst();
              }
              if(i>=num-1){
                  res[index++] = max_value.peekFirst();
              }
        }
        return res;
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值