数组中的所有的中位数

/*
通过大顶堆+小顶堆来实现。经典。

大顶堆中堆顶的元素如果小于小顶堆堆顶的元素,则大顶堆中的所有元素就都小于小顶堆中的所有元素。如果再保证maxHeap.size()==minHeap.size() 或者 maxHeap.size() == minHeap.size() + 1的话,就使用两个堆顶元素就可以直接计算出中位数。

所以得出:

如果maxHeap.size()==minHeap.size() ,(大顶堆堆顶元素+小顶堆堆顶元素)/2就是中位数;
如果maxHeap.size() == minHeap.size() + 1,大顶堆堆顶元素就是中位数;
*/


 /**
  * 本代码由九章算法编辑提供。版权所有,转发请注明出处。
  * - 九章算法致力于帮助更多中国人找到好的工作,教师团队均来自硅谷和国内的一线大公司在职工程师。
  * - 现有的面试培训课程包括:九章算法班,系统设计班,算法强化班,Java入门与基础算法班,Android 项目实战班,Big Data 项目实战班,
  * - 更多详情请见官方网站:http://www.jiuzhang.com/?source=code
  */ 


class Solution {
public:
    /**
     * @param nums: A list of integers.
     * @return: The median of numbers
     */
    vector<int> medianII(vector<int> &nums) {
        // write your code here
        int size=nums.size();
        vector<int> res;
        for(int i=0;i<size;++i){
           addnum(nums[i]);
           res.push_back(maxPQ.top());
        }
        return res;
    }
    
    //priority_que<int> max_heap,min_heap;
       priority_queue<int> maxPQ;    // 默认是大顶堆
       priority_queue<int, vector<int>, greater<int> > minPQ;  // 小顶堆
       vector<int> ans;
      int numOfElements = 0;
      
      void addnum(int value){
          maxPQ.push(value);
          if(numOfElements%2==0){
              if(minPQ.empty()){
                  numOfElements++;
                  return ;
              }else if(maxPQ.top()>minPQ.top()){ // 偶数个 0 1 2 3 4
                  int r1=maxPQ.top();
                  int r2=minPQ.top();
                  maxPQ.pop();
                  minPQ.pop();
                  maxPQ.push(r2);
                  minPQ.push(r1);
              }
          }else{
              minPQ.push(maxPQ.top());
              maxPQ.pop();
          }
          numOfElements++;
      }

};




class Solution {
public:
    /**
     * @param nums: A list of integers.
     * @return: The median of numbers
     */
    priority_queue<int> maxHeap, minHeap;  // 默认为大顶堆
    vector<int> ans;
    int numOfElements = 0;
    vector<int> medianII(vector<int> &nums) {
        // write your code here
        int cnt = nums.size();
        for (int i = 0; i < cnt; ++i) {
		    addNumber(nums[i]);   
		    ans.push_back(getMedian());
		}
        return ans;
    }
    void addNumber(int value) {
		maxHeap.push(value);
		if (numOfElements%2 == 0) {
			if (minHeap.empty()) {
				numOfElements++;
				return;
			}
			else if (maxHeap.top() > -minHeap.top()) {
				int maxHeapRoot = maxHeap.top();
			    int minHeapRoot = -minHeap.top();
                maxHeap.pop();
                minHeap.pop();
				maxHeap.push(minHeapRoot);
				minHeap.push(-maxHeapRoot);
			} 
		} 
		else {
			minHeap.push(-maxHeap.top());
            maxHeap.pop();
		}
		numOfElements++;
	}
	int getMedian() {
		return maxHeap.top();
	}
};

猜你喜欢

转载自blog.csdn.net/u010325193/article/details/86517634