力扣295. 数据流的中位数

 

虽然是难题,代码量并不多,但是高效率的思路真的很难想到

题目:【https://leetcode.cn/problems/find-median-from-data-stream/description/?envType=study-plan-v2&envId=top-interview-150

方法一

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  */

 

posted @ 2025-05-07 11:17  J&YANG  阅读(8)  评论(0)    收藏  举报