剑指offer 面试题64 数据流的中位数

struct cmp
{
	bool operator()(double a, double b)
	{
		return a > b;
	}
};
class Solution {
public:
   void Insert(int num)
{
	if (((maxHeap.size() + minHeap.size()) & 1 )== 0)//如果是偶数,插入到最大堆里面
	{
		if (minHeap.size()>0&&num > minHeap.top())
		{
			int numtmp = minHeap.top();
			minHeap.pop();
			minHeap.push(num);
			num = numtmp;
		}
		maxHeap.push(num);
	}
	else
	{
		if (maxHeap.size()>0&&num < maxHeap.top())
		{
			int numtmp = maxHeap.top();
			maxHeap.pop();
			maxHeap.push(num);
			num = numtmp;
		}
		minHeap.push(num);
	}
}

double GetMedian()
{
	if (((maxHeap.size() + minHeap.size()) & 1) == 0)//如果是偶数
	{
		if (maxHeap.size() + minHeap.size() == 0) return 0;
		return (minHeap.top() + maxHeap.top()) / 2;
	}
	else
	{
		return maxHeap.size() > minHeap.size() ? maxHeap.top() : minHeap.top();
	}
}

private :
    priority_queue<double> maxHeap;
	priority_queue<double,vector<double>,cmp> minHeap;
};

  数组中出现次数超过一半的数

class Solution {
public:
    int MoreThanHalfNum_Solution(vector<int> numbers) {
    	if(numbers.size()==0) return 0;
        int pre=numbers[0];
        int cnt=1;
        for(int i=1;i<numbers.size();i++)
        {
            if(cnt==0)
            {
                pre=numbers[i];
                cnt=1;
            }
            else if(numbers[i]==pre)
            {
                cnt++;
            }
            else
            {
                cnt--;
            }
        }
        cnt=0;
        for(int i=0;i<numbers.size();i++)
        {
            if(numbers[i]==pre)
                cnt++;
        }
        if(cnt>(numbers.size())/2)
            return pre;
        else return 0;
    }
};

  

posted @ 2016-11-23 16:07  simple_wxl  阅读(220)  评论(0)    收藏  举报