《剑指offer》练习-面试题59-滑动窗口的最大值

题目:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{2,3,4,2,6,2,5,1}及滑动窗口的大小3,那么一共存在6个滑动窗口,他们的最大值分别为{4,4,6,6,6,5}; 针对数组{2,3,4,2,6,2,5,1}的滑动窗口有以下6个: {[2,3,4],2,6,2,5,1}, {2,[3,4,2],6,2,5,1}, {2,3,[4,2,6],2,5,1}, {2,3,4,[2,6,2],5,1}, {2,3,4,2,[6,2,5],1}, {2,3,4,2,6,[2,5,1]}。

package offer;

import java.util.ArrayDeque;
import java.util.ArrayList;

public class Solution59 {
	public ArrayList<Integer> maxInWindows(int[] num, int size) {
		ArrayList<Integer> list = new ArrayList<>();
		if (num.length == 0 || num == null || num.length < size || size < 1)
			return list;

		ArrayDeque<Integer> index = new ArrayDeque<>();

		// 遍历0~size范围内
		for (int i = 0; i < size; i++) {
			// 若队尾下标对应的数字小于待存入的数据,那么它不可能是最大值,将其删除
			while (!index.isEmpty() && num[i] >= num[index.peekLast()])
				index.pollLast();

			index.addLast(i);
		}

		// 遍历size~length范围内
		for (int i = size; i < num.length; i++) {
			list.add(num[index.peekFirst()]);

			// 若队尾下标对应的数字小于待存入的数据,那么它不可能是最大值,将其删除
			while (!index.isEmpty() && num[i] >= num[index.peekLast()])
				index.pollLast();

			// 如果滑动窗口已经不包含队首下标对应的值,删除队首元素
			if (!index.isEmpty() && index.peekFirst() <= (i - size))
				index.pollFirst();

			index.addLast(i);
		}
		list.add(num[index.peekFirst()]);
		return list;

	}

}

猜你喜欢

转载自blog.csdn.net/sinat_34548226/article/details/81429046