239. 滑动窗口最大值

  1. class Solution {
  2. public int[] maxSlidingWindow(int[] nums, int k) {
  3. int len = nums.length;
  4. int[] ans = new int[len + 1 - k];
  5. // 构造大顶堆,堆中元素对为<数组中的数, 索引>, 索引用于判断是否在窗口中
  6. PriorityQueue<int[]> maxHeap = new PriorityQueue<>((o1, o2)->(o2[0] != o1[0] ? o2[0] - o1[0] : o2[1] - o1[1]));
  7. for (int i = 0; i < k; i++) {
  8. maxHeap.add(new int[]{nums[i], i});
  9. }
  10. ans[0] = maxHeap.peek()[0];
  11. for (int i = k; i < len; i++) {
  12. maxHeap.add(new int[]{nums[i], i});
  13. // 当前的最大不在窗口中就删除
  14. while (maxHeap.peek()[1] <= i - k) {
  15. maxHeap.poll();
  16. }
  17. ans[i - k + 1] = maxHeap.peek()[0];
  18. }
  19. return ans;
  20. }
  21. }