棋子

导航

中位数II

该题目与思路分析来自九章算法的文章,仅仅是自己做个笔记!

题目:数字是不断进入数组的,在每次添加一个新的数进入数组的同时返回当前新数组的中位数。

解答:
这道题是用堆解决的问题。用两个堆,max heap和min heap,再加一个median值,维持两个堆的大小相等(小根堆可以比大根堆多一个)。对于新来的元素,比较新元素和median的大小,如果小于median就放入大根堆,如果大于median就放入小根堆里面,如果max heap和min heap不平衡了,就调整一下。然后调整过后的median里面的值就是我们要求的中位数。
参考代码
 1 #include<iostream>
 2 #include<vector>
 3 //#include<algorithm>
 4 #include<queue>
 5 using namespace std;
 6 class Solution {
 7 public:
 8     vector<int> medianII(vector<int>& nums)
 9     {
10         vector<int> result;
11         if (nums.size() == 0)
12             return result;
13         int median = nums[0];
14         priority_queue<int> max_heap, min_heap;
15         result.push_back(median);
16         for (int i = 1; i < nums.size(); ++i)//one by one
17         {
18             if (nums[i] < median)
19                 max_heap.push(nums[i]);
20             else
21                 min_heap.push(-nums[i]);
22             if (max_heap.size()>min_heap.size())
23             {
24                 min_heap.push(-median);
25                 median = max_heap.top();
26                 max_heap.pop();
27             }
28             else if (max_heap.size() + 1 < min_heap.size())
29             {
30                 max_heap.push(median);
31                 median = -min_heap.top();
32                 min_heap.pop();
33             }
34             result.push_back(median);
35         }
36         return result;
37     }
38 };
39 int main()
40 {
41     Solution test;
42     vector<int> val = {1,5,6,2,8};
43     vector<int> res = test.medianII(val);
44     for (auto x : res)
45         cout << x << " ";
46     return 0;
47 }
View Code

 

priority_queue<Type, Container, Functional>

 如果我们把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。

posted on 2015-08-26 14:29  鼬与轮回  阅读(263)  评论(0编辑  收藏  举报