算法的学习笔记—滑动窗口的最大值(牛客JZ59)

img

😀前言
滑动窗口问题是常见的算法题型,主要考察如何在限定窗口内找到特定值,比如最大值、最小值等。在这篇文章中,我们将深入分析“滑动窗口的最大值”问题的求解方法,并提供一种实现思路,以帮助大家更好地理解该问题。

🏠个人主页:尘觉主页

🥰滑动窗口的最大值

题目链接

牛客网

😀问题描述

给定一个整数数组 num 和一个整数 size 代表滑动窗口的大小,需要找到每次窗口滑动时的最大值,最后将所有窗口的最大值组合成一个数组返回。例如,对于数组 {2, 3, 4, 2, 6, 2, 5, 1} 和窗口大小 3,滑动窗口的最大值为 {4, 4, 6, 6, 6, 5}

这类问题的挑战在于如何高效地找到滑动窗口中的最大值并随着窗口的移动进行更新,而不是每次移动窗口后重新计算。

image-20201104020702453

❤️‍🔥解题思路

大顶堆法是解决滑动窗口最大值问题的一种高效方案。我们可以使用优先队列(大顶堆)来维护窗口内的最大值。

1. 使用大顶堆求解

大顶堆是一种数据结构,堆顶元素始终是堆中的最大元素。在 Java 中可以使用 PriorityQueue 实现大顶堆,通过传入比较器定义排序方式。以下是解决该问题的详细步骤:

  1. 初始化窗口内的元素:在 num 数组中,首先将前 size 个元素加入到大顶堆中。这样,堆顶元素就是当前窗口的最大值。
  2. 向右滑动窗口:从 size开始,逐步向右滑动窗口,维护堆内的元素。
    • 删除窗口左侧离开的元素,即将堆中的最旧元素移除。
    • 将窗口新加入的元素插入堆中。
    • 堆顶元素即为当前窗口的最大值,将其加入结果数组中。
  3. 完成滑动过程:当窗口滑动到数组末尾时,结束循环。

2. 时间复杂度分析

假设数组的长度为 N,窗口大小为 M。在窗口滑动的过程中,每次添加或删除元素的时间复杂度为 O(log M),因此总体时间复杂度为 O(N log M)。空间复杂度为 O(M),用于存储滑动窗口内的元素。

💝代码实现

以下是该方法的 Java 代码:

import java.util.ArrayList
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

尘觉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值