剑指offer——滑动窗口最大值

解题思路:

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 }
原文地址:https://www.cnblogs.com/wangyufeiaichiyu/p/11228240.html