力扣295. 数据流的中位数
虽然是难题,代码量并不多,但是高效率的思路真的很难想到
方法一
multiset方法,要理解multiset原理
1 class MedianFinder { 2 public: 3 MedianFinder() 4 : m_l(m_cache.end()) 5 , m_r(m_cache.end()) 6 { 7 8 } 9 10 void addNum(int num) { 11 m_cache.insert(num); 12 int size = m_cache.size(); 13 if (1 == size) { 14 m_l = m_cache.begin(); 15 m_r--; 16 return ; 17 } 18 19 if (size & 1) { 20 if (num >= *m_r) 21 m_l++; 22 else if (num < *m_l) 23 m_r--; 24 else { 25 m_l++; 26 m_r--; 27 } 28 } else { 29 if (num >= *m_r) 30 m_r++; 31 else 32 m_l--; 33 } 34 } 35 36 double findMedian() { 37 double ret = (*m_r + *m_l) / 2.0; 38 // cout << m_cache.size() << " l = " << *m_l << ", r = " << *m_r << "res = " << ret << endl; 39 return ret; 40 } 41 42 private: 43 multiset<int> m_cache; 44 multiset<int>::iterator m_l, m_r; 45 }; 46 47 /** 48 * Your MedianFinder object will be instantiated and called as such: 49 * MedianFinder* obj = new MedianFinder(); 50 * obj->addNum(num); 51 * double param_2 = obj->findMedian(); 52 */
方法二
优先级队列
1 class MedianFinder { 2 public: 3 MedianFinder() 4 { 5 } 6 7 void addNum(int num) { 8 if (m_l.empty()) { 9 m_l.push(num); 10 return ; 11 } 12 13 int sl = m_l.size(); 14 int sr = m_r.size(); 15 int tl = m_l.top(); 16 int tr = m_r.empty() ? m_l.top() : m_r.top(); 17 if (num < tl) { 18 m_l.push(num); 19 if (sl > sr) { 20 m_r.push(m_l.top()); 21 m_l.pop(); 22 } 23 } else if (num > tr) { 24 m_r.push(num); 25 if (sl <= sr) { 26 m_l.push(m_r.top()); 27 m_r.pop(); 28 } 29 } else { 30 if (sl > sr) 31 m_r.push(num); 32 else 33 m_l.push(num); 34 } 35 } 36 37 double findMedian() { 38 double ret = m_l.size() != m_r.size() ? m_l.top() : ((m_l.top() + m_r.top()) / 2.0); 39 // cout << m_l.size() << ", " << m_r.size() << ", " << m_l.top() << ", " << m_r.top() << endl; 40 return ret; 41 } 42 43 private: 44 priority_queue<int, vector<int>, less<int>> m_l; 45 priority_queue<int, vector<int>, greater<int>> m_r; 46 }; 47 48 /** 49 * Your MedianFinder object will be instantiated and called as such: 50 * MedianFinder* obj = new MedianFinder(); 51 * obj->addNum(num); 52 * double param_2 = obj->findMedian(); 53 */