AdamDuncan

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

维护两个堆,一个大值堆一个小值堆。

大值堆中维护已经加入的所有的元素的小的那一半

小值堆中维护已经加入的所有的元素的大的那一半

加入一个值,奇数次加入就先加入小值堆,再从小值堆中选一个最小值进入大值堆

偶数次加入就先加入大值堆,再从大值堆中选一个最大值进入小值堆

 1 #include<iostream>
 2 #include<queue>
 3 using namespace std;
 4 class Solution {
 5 public:
 6     Solution()
 7     {
 8         count = 0;
 9     }
10     void Insert(int num)
11     {
12         if (count % 2 ==  0)
13         {
14             minQue.push(num);
15             int fromMinQueToMaxQue = minQue.top();
16             //cout<<"fromMinQueToMaxQue: "<<fromMinQueToMaxQue<<endl; 
17             minQue.pop();
18             maxQue.push(fromMinQueToMaxQue);
19         } else {
20             maxQue.push(num);
21             int fromMaxQueToMinQue = maxQue.top();
22             //cout<<"fromMaxQueToMinQue: "<<fromMaxQueToMinQue<<endl; 
23             maxQue.pop();
24             minQue.push(fromMaxQueToMinQue);
25         }
26         count++;
27     }
28 
29     double GetMedian()
30     { 
31         if (count % 2 == 1)
32         {
33             return (double)maxQue.top();
34         } else {
35             return  ((double)minQue.top() + (double)maxQue.top()) / 2;
36         }
37     }
38 private:
39     int count;
40     priority_queue<int, vector<int>, less<int> > minQue;
41     priority_queue<int, vector<int>, greater<int> > maxQue;
42 };
43 int main()
44 {
45     Solution s = Solution();
46     s.Insert(5);
47     s.Insert(2);
48     s.Insert(3);
49     s.Insert(4);
50     cout<<s.GetMedian()<<endl;
51     return 0;
52     return 0;
53 }

 

posted on 2017-12-26 17:58  AdamDuncan  阅读(476)  评论(0编辑  收藏  举报