剑指offer——43数据流中的中位数

题目描述

如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值。如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值。我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数。

题解:
  目前想不出更好的方法,待续更新。。。

  

 1 class Solution {
 2 private:
 3     vector<int> min;
 4     vector<int> max;
 5 public:
 6         void Insert(int num)
 7         {
 8            int size=min.size()+max.size();
 9            if((size&1)==0)
10            {
11               if(max.size()>0 && num<max[0])
12               {
13                  max.push_back(num);
14                  push_heap(max.begin(),max.end(),less<int>());
15                  num=max[0];
16                  pop_heap(max.begin(),max.end(),less<int>());
17                  max.pop_back();
18               }
19               min.push_back(num);
20               push_heap(min.begin(),min.end(),greater<int>());
21            }
22            else
23            {
24               if(min.size()>0 && num>min[0])
25               {
26                 min.push_back(num);
27                  push_heap(min.begin(),min.end(),greater<int>());
28                  num=min[0];
29                  pop_heap(min.begin(),min.end(),greater<int>());
30                  min.pop_back();
31               }
32               max.push_back(num);
33               push_heap(max.begin(),max.end(),less<int>());
34            }
35         }
36
37         double GetMedian()
38         {
39             int size=min.size()+max.size();
40             if(size<=0)
41                 return 0;
42             if((size&1)==0)
43                 return (max[0]+min[0])/2.0;
44             else
45                 return min[0];
46         }
47
48
49 };

原文地址:https://www.cnblogs.com/zzw1024/p/11689380.html

时间: 2024-10-26 08:56:39

剑指offer——43数据流中的中位数的相关文章

剑指offer:数据流中的中位数(小顶堆+大顶堆)

1. 题目描述 /** 如何得到一个数据流中的中位数? 如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值. 如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 我们使用 Insert()方法读取数据流,使用 GetMedian()方法获取当前读取数据的中位数. */ 2. 思路 /** 最大堆和最小堆 * 每次插入小顶堆的是当前大顶堆中最大的数 * 每次插入大顶堆的是当前小顶堆中最小的数 * 这样保证小顶堆中的数永远大于等于大顶堆中的数(值

[剑指Offer] 62.数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 1 class Solution { 2 public: 3 vector<int> vec; 4 void Insert(int num) 5 { 6 vec.push_back(num); 7 } 8 9 double GetMedian() 10 { 11 sort(vec.begin(),v

《剑指offer》数据流中的中位数

[ 声明:版权所有,转载请标明出处,请勿用于商业用途.  联系信箱:[email protected]] 题目链接:http://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?rp=4&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking 题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后

[剑指offer] 63. 数据流中的中位数

题目描述 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数. 用一个大顶堆和一个小顶堆,维持大顶堆的数都小于等于小顶堆的数,且两者的个数相等或差1.平均数就在两个堆顶的数之中. 原文地址:https://www.cnblogs.com/ruoh3kou/p/10261

剑指offer:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数. 思路分析: 思路一:最朴素的想法,用一个vector来存输入的数据流.在取中位数的函数中,每次对数据流进行一次排序,对于奇数长度的数据,直接取中间值,对于偶数长度的数据,取中间两个数的平均值.很显然,这个

【剑指offer】数据流中的中位数

题目链接:数据流中的中位数 题意:如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值.我们使用Insert()方法读取数据流,使用GetMedian()方法获取当前读取数据的中位数. 题解:啊我这题用暴力做的..正解应该是最大堆最小堆..和之前一个题一样.后面再补. 暴力就是sort一下找中位数. 代码: class Solution { public: vect

[剑指offer] 41. 数据流中的中位数 (大小堆,优先队列)

对于海量数据与数据流,用最大堆,最小堆来管理. class Solution { public: /* * 1.定义一个规则:保证左边(大顶堆)和右边(小顶堆)个数相差不大于1,且大顶堆的数值都小于等于小顶堆的数 * 2.大小堆顶可以用优先序列实现 插入规则: 当插入数值小于左边的堆顶时候,就插入左边,否则插入右边堆.(注意初始为空时,插入不能比较) 调整使得满足个数差<=1: 正常时是只有两种情况:p=q或者p=q+1,由于每插一个值就会考虑调整,那么边界情况就是p=q+2或者p+1=q p=

剑指offer63:数据流中的中位数

题目描述: 如何得到一个数据流中的中位数?如果从数据流中读出奇数个数值,那么中位数就是所有数值排序之后位于中间的数值.如果从数据流中读出偶数个数值,那么中位数就是所有数值排序之后中间两个数的平均值. 本题最开始简单的理解为求中位数,使用的是快排的思想,当数据元素为奇数个时,求第n/2大的数,当元素个数为偶数时,先求n/2个数,然后对右边的求出一个最小值. 看了别人的做法,发现应该把这道题理解为一个在线算法题.关键是使用两个堆,最大化堆存储前n/2个数,最小化堆存储后n/2个数,当元素个数为偶数个

剑指offer (29) 数组中出现次数超过一半或1/3或1/N的数字

题目:数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字 方法一:如果把这个数字排序,那么排序之后位于数组中间的数字一定就是出现次数超过数组长度一半的数字 这个数字就是统计学中的中位数,即长度为n的数组中第n/2大的数字 在数组中得到任意第k大数字,这一问题有O(n)解,注:这里第kth个元素,kth从1开始计数,并且重复元素不去重 (1) 直接sort排序,然后定位到索引为kth-1的元素 int FindKth1(std::vector<int>& num, int kt