【LeetCode】239. Sliding Window Maximum(Java)

本文介绍了一种解决滑动窗口最大值问题的算法实现,通过使用优先队列(小顶堆)来高效找到滑动窗口内的最大值。具体步骤包括初始化优先队列,遍历数组构建小顶堆,以及存储并更新最大值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:给定一个数组数字,有一个大小为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)));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值