数组最大生成窗口

    /**
     * 最大生成窗口:
     *  n-w+1个res
     * 
     *  res[]每个状态的最大值
     *  设窗口大小:3
     *      2 1 4 -5 6 7
     *          7 0  5 8        
     *          5 -1 1 3
     *   preMax=0
     *   curMax=0
     *   k=0
     *   
     *   i=0遍历数组
     *   
     *   使用Queue实现:
     *      0、判断要求w<=arr.length且w>0
     *      1、小于3时需入队列,判断是否越界即i+1<=length
     *          未越界:若长度还小于3,继续执行步骤1
     *          越界:退出循环
     *      2、长度为3时,循环出入队列3次,累加和存入res[k]
     *      
     *      3、出队列,长度变成2,执行步骤1
     *   
     *   
     *      2 ,2  1,2 1 4  , 1 4 -5, 4 -5 6, -5  6  7, 6 7 _
     *    小于3           7        0        5         8          越界
     * 
     */
     public static void  getMaxWindow(int[] arr,int w){
         if(arr==null||w>arr.length){
             return;
         }
         Queue<Integer> queue=new LinkedList<Integer>();
         int res=arr.length-w+1;
         int index=0;
         int max=0;
         int tmp=0;
         int last=0;
         for(int i=0;i<res;i++){
             while(queue.size()<w&&index<arr.length){
                 queue.offer(arr[index]);
                 tmp+=arr[index];
                 index++;
             }
             //System.out.println(tmp);
             if(tmp>max){
                 max=tmp;
                 last=index;
             }
             tmp-=queue.poll();  
         }
         System.out.println("最大值:"+max);
         System.out.print("最大窗口:");
         for(int i=last-w;i<last;i++){
             System.out.print(arr[i]+" ");
         }
     }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值