【剑指offer】_18 数据流中的中位数
題目描述
如何得到一個(gè)數(shù)據(jù)流中的中位數(shù)?如果從數(shù)據(jù)流中讀出奇數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后位于中間的數(shù)值。如果從數(shù)據(jù)流中讀出偶數(shù)個(gè)數(shù)值,那么中位數(shù)就是所有數(shù)值排序之后中間兩個(gè)數(shù)的平均值。我們使用Insert()方法讀取數(shù)據(jù)流,使用GetMedian()方法獲取當(dāng)前讀取數(shù)據(jù)的中位數(shù)。
解題思路
一般數(shù)據(jù)流我們用數(shù)組來表示,要得到中位數(shù)有很多種方法,這里介紹一種時(shí)間復(fù)雜度較小的方法,用C++種的優(yōu)先級(jí)隊(duì)列。
也就是劍指offer書上的方法,把數(shù)組邏輯上分成兩個(gè)部分,左邊為最大堆,右邊為最小堆。我們始終要保證最大堆中最大的元素要小于最小堆中最小的元素即可,當(dāng)然除此之外,還要判斷數(shù)組中元素個(gè)數(shù)是偶數(shù)還是奇數(shù),如果要判斷我們必須要讓兩個(gè)堆中的元素個(gè)數(shù)之差不大于1,在這里,我們保證最大堆的元素個(gè)數(shù)可以等于最小堆元素個(gè)數(shù)+1,但是最小堆堆元素個(gè)數(shù)最多只能與最大堆相同。 那么如果兩個(gè)堆的元素個(gè)數(shù)相同,那么就是偶數(shù),那么中位數(shù)就是兩個(gè)堆頂元素之和除以2,如果不相同的話,說明最大堆的元素個(gè)數(shù)多,取最大堆堆頂元素即可。
代碼實(shí)現(xiàn)
class Solution {priority_queue<int,vector<int>,less<int>> max;priority_queue<int,vector<int>,greater<int>> min; public:void Insert(int num){if(max.empty() || num<= max.top())max.push(num);elsemin.push(num);//保證兩個(gè)堆的元素個(gè)數(shù)之差小于1if(max.size() == min.size()+2){min.push(max.top());max.pop();}if(max.size()+1 == min.size()){max.push(min.top()); min.pop();}}double GetMedian(){ return max.size() == min.size() ? (max.top()+min.top())/2.0 : max.top();}};總結(jié)
以上是生活随笔為你收集整理的【剑指offer】_18 数据流中的中位数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 像傻瓜一样去爱吧剧情介绍
- 下一篇: 想在家里卧室安装一台投影仪,请问一下大家