滑动窗口的最大值
题目描述:给定一个数组和滑动窗口的大小,找出所有滑动窗口里数值的最大值。例如,如果输入数组 {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]}。窗口大于数组长度的时候,返回空。
分析:使用一个单调递减栈保存数组下标,用单调递减栈的原因是为了使栈的最左是当前窗口的最大值,如果用递增栈无法保证栈的右边是当前栈的最大值。循环遍历如果数据过期就弹出保证当前栈的最左边是该窗口最大值的坐标。
PS:与牛客相同!
1 import java.util.*; 2 public class Solution { 3 public ArrayList<Integer> maxInWindows(int [] num, int size) 4 { 5 6 ArrayList<Integer> list = new ArrayList<>(); 7 LinkedList<Integer> stack = new LinkedList<>(); 8 if(size==0||num.length==0||size>num.length)return list; 9 for (int i = 0; i < size; i++) { 10 11 while(!stack.isEmpty()&&num[stack.peekLast()]<num[i]){ 12 stack.pollLast(); 13 } 14 stack.add(i); 15 } 16 list.add(num[stack.peekFirst()]); 17 for (int i = 1; i < num.length-size+1 ; i++) { 18 while(!stack.isEmpty()&&i>stack.peekFirst()){ 19 stack.pollFirst(); 20 } 21 while(!stack.isEmpty()&&num[stack.peekLast()]<num[i+size-1]){ 22 stack.pollLast(); 23 } 24 stack.addLast(i+size-1); 25 26 list.add(num[stack.peekFirst()]); 27 28 } 29 return list; 30 31 } 32 }