[leetcode题解] 第480题Sliding Window Median

本文详细解析LeetCode第480题——滑动窗口中位数。此题是295题数据流中位数的进阶版,涉及动态窗口和删除操作。通过使用两个堆并引入延迟删除概念,利用哈希表记录删除操作,确保在堆顶元素需要删除时才执行。文中还给出了具体的解题步骤和关键代码实现。
摘要由CSDN通过智能技术生成

https://leetcode-cn.com/problems/sliding-window-median/

分析

这道题是295.数据流的中位数这题的进阶版,此时数据流变成了一个固定大小的窗口,每次新加入一个数字就会有一个旧的数字被移除,因此,这相当于在295题的基础上引入了删除操作。
295题的解法是用两个堆来存放数据流中的数据集,small存小的那一半,large存大的那一半,并保证smallSize == largeSize || smallSize == largeSize + 1。这样一来获取中位数就是 O ( 1 ) O(1) O(1)的操作,简单不需要赘述;新加入一个数字时需要维护这两个堆满足的条件,有两种写法:

if (left.size() == right.size()) {
   
    right.push(num);
    left.push(right.top());
    right.pop();
}
else {
   
    left.push(num);
    right.push(left.top());
    left.pop();
}
if (small.empty() || num <= small.top()) small.push(num);
else large.push(num);
// 堆内的元素个数不满足条件的两种情况
if (small.size() == large.size() + 2) {
   
	large.push(small.top());
    small.pop();
}
else if (small.size() + 1 == large.size()) {
   
	small.push(large.top());
	large.pop();
}

显然第一种写法更简洁,这里提到第二种写法是因为它适合用在本题的编码。

解法

相比于295题,本题多了一个删除操作,而堆是只能删除堆顶元素的,因此看上去不可实现。为了解决此题,我们可以引入一个延迟删除的概念,即当我们需要把一个数字移出窗口时,不直接把它从堆内删除(

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值