解题思路:
https://www.jianshu.com/p/5b4de9c6117c
1 import java.util.ArrayList; 2 import java.util.ArrayDeque; 3 public class Solution { 4 public ArrayList<Integer> maxInWindows(int [] num, int size) 5 { 6 ArrayList<Integer> result = new ArrayList<>(); 7 // 排除特殊情况,窗口的长度为0 8 if (size==0) return result; 9 10 // 滑动窗口最左边数的index 11 int begin; 12 // 建立一个双端队列 13 ArrayDeque<Integer> q = new ArrayDeque<>(); 14 for(int i=0;i<num.length;i++){ 15 // begin是窗口起始位置 16 begin = i-size+1; 17 // 队列空,直接加入 18 if(q.isEmpty()) 19 q.add(i); 20 // 若队列最左边值已经不在窗口内,直接删除 21 else if(begin > q.peekFirst()) 22 q.pollFirst(); 23 24 // 从队尾开始比较,把所有比他小的值丢掉 25 while((!q.isEmpty()) && num[q.peekLast()] <= num[i]) 26 q.pollLast(); 27 // 随后再把它放进去 28 q.add(i); 29 30 // 若窗口起始位置在数组的0位置上或者之后(窗口是完整大小的),才计算窗口的有效最大值 31 if(begin>=0){ 32 // 永远是队列最左边最大,加入结果集 33 result.add(num[q.peekFirst()]); 34 } 35 } 36 return result; 37 } 38 }