【LeetCode】239. Sliding Window Maximum(Java)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Rabbit_Judy/article/details/87993711

题目描述:给定一个数组数字,有一个大小为k的滑动窗口,它从数组的最左边移动到最右边。你只能在窗口看到k个数字。每次滑动窗口右移一个位置。返回最大滑动窗口。

Example:
Input: nums = [1,3,-1,-3,5,3,6,7], and k = 3
Output: [3,3,5,5,6,7]
Explanation:
在这里插入图片描述

package Algorithm.LeetCode.T239;

import java.util.Arrays;
import java.util.PriorityQueue;

/**
 * 返回滑动窗口中的最大值
 *
 * @author wangfei
 */
public class Solution {

    /**
     * 注:Java中默认优先队列就是小顶堆,且一个数越大其相反数越小
     * 1.创建一个优先队列,将前两个数组元素的相反数放入优先队列中
     * 2.遍历数组中其余元素的相反数依次放入优先队列构建小顶堆
     * 3.将堆顶元素的相反数(即原数组中的数)存入max数组中
     *
     * @param nums
     * @param k
     * @return
     */
    public static int[] maxSlidingWindow(int[] nums, int k) {
        if (k <= 0)
            return new int[0];
        PriorityQueue<Integer> queue = new PriorityQueue<>();
        for (int i = 0; i < k - 1; i++) {
            queue.add(-nums[i]);
        }
        int[] max = new int[nums.length - k + 1];
        for (int i = 0, j = k - 1; j < nums.length; i++, j++) {
            queue.add(-nums[j]);
            max[i] = -queue.peek();
            queue.remove(-nums[j - k + 1]);
        }
        return max;
    }

    public static void main(String[] args) {
        int[] nums = {1, 3, -1, -3, 5, 3, 6, 7};
        int k = 3;
        System.out.print(Arrays.toString(maxSlidingWindow(nums, k)));
    }
}

猜你喜欢

转载自blog.csdn.net/Rabbit_Judy/article/details/87993711