生成窗口最大值数组


实现的完整代码如下:

import java.util.*;
//生成窗口最大值数组(设计时间复杂度为O(N)的算法)
public class getMaxWindowArr{

     /**
     获得最大值数组
     arr[] 表示源数组
     w     滑动窗口的大小
     ret   返回的最大值数组
   
     **/
    public static int[] getMax(int[]arr,int w)
    {
     if(arr==null ||w<1|| arr.length<w)
     {
      return null;	
     }

      LinkedList<Integer> qmax=new LinkedList<Integer>(); //充当双端队列

      int []maxArr=new int[arr.length-w+1]; //存放最大值数组

      int index=0;

      for(int i=0;i<arr.length;i++)
      {
          while(!qmax.isEmpty()&&arr[qmax.peekLast()]<=arr[i])
          {
          	qmax.pollLast();
          }
          qmax.addLast(i);  //添加下标

          if(qmax.peekFirst()==i-w)//头部下标过期
          {
          	qmax.pollFirst();
          }
          if(i>=w-1) //达到滑动窗口的大小
          {
          	maxArr[index++]=arr[qmax.peekFirst()];
          }

      }
          return maxArr;     
    }
	public  static void main(String[]args)
	{
		int []arr={4,3,5,4,3,3,6,7};

		int []maxArr=getMax(arr,3);  //滑动窗口的大小为3

		for(int i=0;i<maxArr.length;i++)
		{

			System.out.print(maxArr[i]+"  ");
		}
		
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值