在第i个数要找左侧窗口内的最大数。所以又可以单调栈套娃
唯一需要变化的就是栈上只保留窗口以内的数,所以栈上存下标以查看栈上最老的数是否还在窗口内。

再来一遍口诀:
找右边的就从右往左,找左边的从左往右
找小的就递增,找大的就递减

这里找左边最大, 那就是从左向右+递减。

import java.util.*;

// 找左边最大 -> 从左向右 (非单调)递减
public class Solution {
    public ArrayList<Integer> maxInWindows(int[] num, int size) {
      ArrayList<Integer> ans = new ArrayList<>();
      if (size > num.length || size == 0) return ans;
      
      Deque<Integer> dq = new ArrayDeque<>();
      for (int i = 0; i < num.length; i++) {
        if (!dq.isEmpty() && dq.peekFirst() <= i-size)
          dq.pollFirst();  // remove oldest number if outside window
        
        // 以满足非单调递减
        while(!dq.isEmpty() && num[i] >= num[dq.peekLast()])
          dq.pollLast();
        dq.offerLast(i);
        
        if (i >= size - 1)
          ans.add(num[dq.peekFirst()]); // dq从前向后递减 -> first最大
      }
      
      return ans;
    }
}