题目描述:
如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。
知识点:
- 二分搜索
解题思路:
- 这道题分为两部分,一部分是将所给的数按照从小到大的顺序插入到数组中,方便后序中位数的查找。一部分是在我们上一步所创建的数组中找到其中的中位数。
- 首先是第一部分,我们采取二分搜索的方法来插入中位数,如果中间值等于所给值那么我们将所给值插入到中间值的旁边便好,这属于特殊情况。其余按照二分搜索来进行便好。
- 第二部分是查找中位数,如果数组为奇数那么我们按照中间的索引输出便好,如果是偶数,我们需要输出中间两个数的和的一半便好
解题代码:
let arr = [];function Insert(num) // 二分搜索查找中位数{// write code hereif(!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 hereif(!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;}}
