数据流中的中位数_牛客题霸_牛客网 (nowcoder.com)
Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数
几种类型强转:
dynamic_cast:用于安全地将指针或引用转换成其继承层次中的其他类型。只能用于多态类型,即至少有一个虚函数的类。
reinterpret_cast:用于进行底层的类型转换,即将一个指针转换成一个整数值或者将一个整数值转换成一个指针。由于该转换不会进行任何类型检查,因此使用时要非常谨慎。
const_cast:用于去除对象的const属性,即将const类型转换成非const类型。该转换只能作用于指针或引用。
static_cast:用于基本数据类型之间的转换,如将整数转换成浮点数、浮点数转换成整数、将指针或引用转换成不同的指针或引用类型等。它是最常用的转换方式之一。
二分查找函数:
lower_bound返回一个迭代器,指向在[first,last)范围内的第一个大于或等于val的元素。
upper_bound返回一个迭代器,指向在[first,last)范围内的第一个大于val的元素。
(有目标值返回该元素在序列中位置,如果序列中不存在大于或等于目标值的元素,返回end()指针)
时间复杂度都是O(log n)
"(sz >> 1)"表示计算sz除以2的结果,向下取整。即如果sz是偶数,结果为sz/2;如果sz是奇数,结果为(sz-1)/2
class Solution {
public:
#define SCD static_cast<double>
vector<int> v;
void Insert(int num)
{
if (v.empty()) {
v.push_back(num);
}
else {
auto it = lower_bound(v.begin(), v.end(), num);
v.insert(it, num);
}
}
double GetMedian()
{
int sz = v.size();
if (sz & 1) { //检测一个数是否是奇数
return SCD(v[sz >> 1]); //sz的二进制数向右移动一位,相当于返回2的整数部分 sz/2
}
else {
return SCD(v[sz >> 1] + v[(sz - 1) >> 1]) / 2;
}
}
};