滑动窗口最大值(剑指offer)_学习记录
【题目描述】
给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组{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]}。
【算法实现】
import java.util.*;
/**
* 滑动窗口的最大值
* @author Guozhu Zhu
* @date 2018/10/3
* @version 1.0
*
*/
public class Solution {
public ArrayList<Integer> maxInWindows(int [] num, int size){
ArrayList<Integer> resList = new ArrayList<Integer>();
if(num == null || num.length == 0 || size <= 0) {
return resList;
}
LinkedList<Integer> queue = new LinkedList<Integer>();
for (int i = 0; i < size-1; i++) {
while (!queue.isEmpty() && num[i] > num[queue.getLast()]) {
queue.pollLast();
}
queue.offerLast(i);
}
for (int i = size-1; i < num.length; i++) {
while (!queue.isEmpty() && num[i] > num[queue.getLast()]) {
queue.pollLast();
}
queue.offerLast(i);
if (size < (i-queue.getFirst()+1)) {
queue.pollFirst();
}
resList.add(num[queue.getFirst()]);
}
return resList;
}
}