力扣做题20. 连续中值
这类型的题以前做过,二分法找中间值,算是温故知新吧
随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5
设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
示例:
addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3)
findMedian() -> 2
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/continuous-median-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
/** * initialize your data structure here. */ var MedianFinder = function() { this.data=[] }; /** * @param {number} num * @return {void} */ MedianFinder.prototype.addNum = function(num) { const data=this.data; let left=0; let right=data.length; let mid=left; while(left<right){ mid=(left+right)>>1; if(num>data[mid]){ left=Math.max(mid,left+1); }else if(num<data[mid]){ right=Math.min(mid,right-1); }else if(num===data[mid]){ left=mid; right=mid; } } data.splice(left,0,num) }; /** * @return {number} */ MedianFinder.prototype.findMedian = function() { const data=this.data; if(data.length%2===0){ const mid=data.length/2; return (data[mid]+data[mid-1])/2 }else{ const mid=data.length>>1; return data[mid] } }; /** * Your MedianFinder object will be instantiated and called as such: * var obj = new MedianFinder() * obj.addNum(num) * var param_2 = obj.findMedian() */