实现的完整代码如下:
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]+" ");
}
}
}