239. 滑动窗口最大值

  1. public int[] maxSlidingWindow(int[] a, int k) {
  2. if (a == null || k <= 0) {
  3. return new int[0];
  4. }
  5. int n = a.length;
  6. int[] r = new int[n-k+1];
  7. int ri = 0;
  8. // store index
  9. Deque<Integer> q = new ArrayDeque<>();
  10. for (int i = 0; i < a.length; i++) {
  11. // remove numbers out of range k
  12. // 移除k以外的元素
  13. while (!q.isEmpty() && q.peek() < i - k + 1) {
  14. q.poll();
  15. }
  16. // remove smaller numbers in k range as they are useless
  17. while (!q.isEmpty() && a[q.peekLast()] < a[i]) {
  18. q.pollLast();
  19. }
  20. // q contains index... r contains content
  21. q.offer(i);
  22. if (i >= k - 1) {
  23. r[ri++] = a[q.peek()];
  24. }
  25. }
  26. return r;
  27. }

难点: