LeetCode295——Find Median from Data Stream

2092 단어 leetcode
LeetCode295——Find Median from Data Stream
전제는 Ordered List입니다.
그러나 삽입, 즉 addNum 작업은 순서가 없을 수 있습니다.
시퀀스 정렬을 시도한 후에 되돌아오는 방법은 시간이 초과되었습니다.생각해보니까 천진하다. 코드:
class MedianFinder {
private:
	vectornums;
public:

	// Adds a number into the data structure.
	void addNum(int num) {
	    nums.push_back(num);
	    sort(nums.begin(),nums.end());
	}

	// Returns the median of current data stream
	double findMedian() {
	    if(nums.size()%2==0)
	    {
	        return (nums[nums.size()/2]+nums[nums.size()/2-1])/2.0;
	    }
	    else
	    {
	        return nums[nums.size()/2];
	    }
	}
};

이 문제의 관건은 두 개의 무더기, 한 개의 큰 무더기, 한 개의 작은 무더기를 유지하는 데 있다. 이렇게 하면 삽입할 때 이미 질서가 보장된다.
큰 지붕더미에 대해 지붕은 틀림없이 더미 중 가장 큰 값이다.
작은 지붕더미에 대해 지붕은 틀림없이 더미 중 가장 작은 값이다.
지금 우리는 질서정연한 서열을 가설하고 이 서열을 반으로 나눈다. 왼쪽 반은 비교적 소수이고 오른쪽 반은 비교적 큰 수이다.
우리는 비교적 작은 수를 큰 무더기로 저장하고, 비교적 큰 수는 작은 무더기로 저장한다.
그러면 큰 무더기의 뿌리는 반드시 소수 안의 최대수이고 작은 무더기의 뿌리는 반드시 큰 수 안의 최소수이며 질서 서열 중의 중간의 두 개수이다.
우리는 삽입 과정 중, 시종 크기 무더기의 크기 차이가 초과하지 않도록 보증한다.1
삽입이 완료되면 다음이 수행됩니다.
큰 무더기의 크기 = 작은 무더기의 크기가 되돌아오기(maxHeap.top () +minHeap.top() )/2.0
큰 무더기의 크기 > 작은 무더기의 크기는 maxHeap로 바로 돌아갑니다.top()
그렇지 않으면 MinHeap로 바로 돌아갑니다.top()
코드:
class MedianFinder {
private:
	priority_queue ,less> maxHeap;			//      
	priority_queue,greater> minHeap;		//      
public:

	// Adds a number into the data structure.
	void addNum(int num) {
		maxHeap.push(num);//        
		int t = maxHeap.top(); //          
		maxHeap.pop();
		minHeap.push(t);//          
		int maxLen = maxHeap.size();
		int minLen = minHeap.size();
		if (minLen - maxLen > 0)
		{
			int t = minHeap.top();
			maxHeap.push(t);
			minHeap.pop();
		}
	}

	// Returns the median of current data stream
	double findMedian() {
		if (maxHeap.size() > minHeap.size())
			return maxHeap.top()*1.0;
		else if (maxHeap.size() < minHeap.size())
			return minHeap.top()*1.0;
		else
			return (minHeap.top() + maxHeap.top()) / 2.0;
	}
};

좋은 웹페이지 즐겨찾기