007-生成窗口最大值的数组

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;
	}
}

猜你喜欢

转载自blog.csdn.net/xiongmengyao/article/details/89489591