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