LintCode "Sliding Window Median" & "Data Stream Median"
2024-10-19 00:24:28
Besides heap, multiset<int> can also be used:
class Solution {
void removeOnly1(multiset<int> &ms, int v)
{
auto pr = ms.equal_range(v);
ms.erase(pr.first);
} void remove(multiset<int> &lmax, multiset<int> &rmin, int v)
{
if(v <= *lmax.rbegin())
{
removeOnly1(lmax, v);
if(lmax.size() < rmin.size())
{
int tmp = *rmin.begin();
lmax.insert(tmp);
removeOnly1(rmin, tmp);
}
}
else if(v >= *rmin.begin())
{
removeOnly1(rmin, v);
if((lmax.size() - rmin.size()) > )
{
int tmp = *lmax.rbegin();
removeOnly1(lmax, tmp);
rmin.insert(tmp);
}
}
} void addin(multiset<int> &lmax, multiset<int> &rmin, int v)
{
if(lmax.empty())
{
lmax.insert(v);
return;
}
int lmax_v = *lmax.rbegin();
int size_l = lmax.size(), size_r = rmin.size();
if(v <= lmax_v) // to add left
{
lmax.insert(v);
if((size_l + - size_r) > )
{
int tmp = *lmax.rbegin();
rmin.insert(tmp);
removeOnly1(lmax, tmp);
}
}
else
{
rmin.insert(v);
if((size_r + )> size_l)
{
int tmp = *rmin.begin();
removeOnly1(rmin, tmp);
lmax.insert(tmp);
}
}
}
public:
/**
* @param nums: A list of integers.
* @return: The median of the element inside the window at each moving
*/
vector<int> medianSlidingWindow(vector<int> &nums, int k) {
vector<int> ret; multiset<int> lmax, rmin; // sizeof(lmax) - sizeof(rmin) -> [0,1] size_t n = nums.size();
for(int i = ; i < n; i ++)
{
if(i >= k)
{
remove(lmax, rmin, nums[i - k]);
} //
addin(lmax, rmin, nums[i]);
//
if(i >= k - )
{
ret.push_back(*lmax.rbegin());
}
}
return ret;
}
};
最新文章
- 使用VS+VisualGDB编译调试Linux程序
- fdisk,mount.label
- 魅族手机(魅蓝note)无法作为调试设备连接到mac问题的解决
- Webpack教程二
- [转]CharacterController与Rigidbody
- Android studio 安装,JDK 出错解决方案
- [033] 微信公众帐号开发教程第9篇-QQ表情的发送与接收(转)
- Python Selenium 之数据驱动测试
- SQL 聚集函数(聚组函数)的使用 注意事项
- mybatis_异常
- D. Kilani and the Game(多源BFS)
- Python(十三)python的函数重载
- AT2046 Namori 图论
- float浮动,定位
- react事件中的this指向
- 创建Python程序
- 解决ios微信内置浏览器触发事件有问题方案
- 4-在windon10上mysql安装与图形化管理
- C#的可空类型与不可空类型
- 基于RedHat6.5的Greenplum环境配置