1. public int[] maxSlidingWindow(int[] nums, int k) {
    2. // 改为大顶堆
    3. PriorityQueue<int[]> queue = new PriorityQueue<>(k, new Comparator<int[]>() {
    4. @Override
    5. public int compare(int[] o1, int[] o2) {
    6. return o2[0] - o1[0];
    7. }
    8. });
    9. int[] ans = new int[nums.length - k + 1];
    10. for (int i = 0; i < k; i++) {
    11. // queue's element 0:值 1:值对应的索引
    12. queue.offer(new int[]{nums[i], i});
    13. }
    14. ans[0] = queue.peek()[0];
    15. for (int i = k; i < nums.length; i++) {
    16. queue.offer(new int[]{nums[i], i});
    17. // 索引值
    18. while (queue.peek()[1] <= i - k) {
    19. // 最大顶堆值不在滑动窗口内
    20. queue.poll();
    21. }
    22. ans[i - k + 1] = queue.peek()[0];
    23. }
    24. return ans;
    25. }
    1. public int[] maxSlidingWindow(int[] nums, int k) {
    2. int n = nums.length;
    3. if (n == 0) {
    4. return nums;
    5. }
    6. // 队列存索引值
    7. Deque<Integer> deque = new LinkedList();
    8. int[] ans = new int[n - k + 1];
    9. for (int i = 0; i < n; i++) {
    10. // i-k+1 滑动窗口起始索引值
    11. if (!deque.isEmpty() && deque.peek() < i - k + 1) {
    12. deque.poll();
    13. }
    14. // nums[i]比队列中的元素都大
    15. while (!deque.isEmpty() && nums[i] >= nums[deque.peekLast()]) {
    16. deque.pollLast();
    17. }
    18. deque.offer(i);
    19. // i-k+1>=0 读完滑动窗口所有值
    20. if (i - k + 1 >= 0) {
    21. ans[i - k + 1] = nums[deque.peek()];
    22. }
    23. }
    24. return ans;
    25. }