题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
知识点:
- 二分搜索
解题思路:
- 这道题分为两部分,一部分是将所给的数按照从小到大的顺序插入到数组中,方便后序中位数的查找。一部分是在我们上一步所创建的数组中找到其中的中位数。
- 首先是第一部分,我们采取二分搜索的方法来插入中位数,如果中间值等于所给值那么我们将所给值插入到中间值的旁边便好,这属于特殊情况。其余按照二分搜索来进行便好。
- 第二部分是查找中位数,如果数组为奇数那么我们按照中间的索引输出便好,如果是偶数,我们需要输出中间两个数的和的一半便好
解题代码:
let arr = [];
function Insert(num) // 二分搜索查找中位数
{
// write code here
if(!arr.length) {
arr.push(num);
return;
}
let left = 0;
let right = arr.length - 1;
while(left < right) {
let mid = (left + right) >> 1;
if(arr[mid] === num) {
arr.splice(mid+1,0,num);
return;
}else if(arr[mid] < num) {
left = mid + 1;
}else {
right = mid - 1;
}
}
return arr.splice(right,0,num);
}
function GetMedian(){
// write code here
if(!arr.length) return null;
let length = arr.length;
let mid = (length - 1) >> 1; // 中间值的索引,或者中间值靠右的索引
if(length % 2 === 1) { // 判断数组的长度是奇数还是偶数
return arr[mid];
}else {
return (arr[mid] + arr[mid+1])/2;
}
}