package com.my.suanfa;
import java.util.LinkedList;
/*
* 生成窗口最大值数组
* */
public class Solution03 {
public int[] getMaxWindow(int[] arr, int w) {
//边界条件判断
if(arr == null ||w < 1 || arr.length < w) {
return null;
}
//创建双端队列用来保存每次的最大值的下标
LinkedList<Integer> qmax = new LinkedList<Integer>();
//创建一个数组来保存窗口数组的最大值,一共会生成arr.length - w + 1个最大值
int[] res = new int[arr.length - w + 1];
//记录最终生成的最大值数组的下标
int index = 0;
for(int i = 0; i < arr.length; i++) {
//如果qmax不为空,并且队尾元素小于等于当前元素,那么队尾元素就不可能是最大值,就将队尾元素移除双端队列
while(!qmax.isEmpty() && arr[i] >= arr[qmax.peekLast()]) {
qmax.pollLast();
}
//如果当前队列为空或者队尾元素大于当前元素,那么就将当前元素放在队尾
qmax.addLast(i);
//如果队伍中的元素大于窗口的大小,那么表明当前对头元素已经失效,便将队头元素移除当前队列
if(i - qmax.peekFirst() == w) {
qmax.pollFirst();
}
//如果当前队头元素下标大于等于w - 1,则说明当前队列中的元素个数足够组成一个窗口,便可以开始取出最大值
if(i >= w - 1) {
res[index++] = arr[qmax.peekFirst()];
}
}
return res;
}
}
007-生成窗口最大值的数组
最新推荐文章于 2022-06-26 16:02:14 发布