【LeetCode】剑指 Offer(22)

简介: 【LeetCode】剑指 Offer(22)

题目:剑指 Offer 41. 数据流中的中位数 - 力扣(Leetcode)


题目的接口:

class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {
    }
    void addNum(int num) {
    }
    double findMedian() {
    }
};
/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */


解题思路:

我的思路是:


通过优先级队列维护一个大堆,一个小堆;


输入数据的时候:


1. 如果两个堆size相同,先进大堆,大堆top再进小堆,维持大堆比小堆小;


2. 如果小堆size大于大堆,先进小堆,小堆top再进大堆,维持大堆比小堆小。


例:



现在两个堆大小相同,


所以2进大堆:



根据我们的思路,


再进小堆:



现在小堆比大堆大,


我们先让3进小堆:



然后,让小堆的top


再进大堆:



现在大堆和小堆又一样大了,


所以,4先进大堆:



然后让大堆的top


再进小堆:


通过观察上面的图解,我们可以清楚的观察到,


大堆和小堆实现了一个动态的平衡状态,


也让中位数的求解变成只需要观察他们的堆顶即可。


查找中位数的时候:


1. 如果小堆size大于大堆,返回小堆堆顶;


2. 如果两个堆size相等,返回两个堆堆顶的值*0.5(中位数)。


代码:

class MedianFinder {
public:
    //建一个大堆
    priority_queue, less> max_q;
    //建一个小堆
    priority_queue, greater> min_q;
    MedianFinder() {
    }
    void addNum(int num) {
        //如果两个堆size相等
        if(max_q.size() == min_q.size())
        {
            //先进大堆,大堆top再进小堆,维持大堆比小堆小
            max_q.push(num);
            min_q.push(max_q.top());
            max_q.pop();
        }
        else//如果小堆size大于大堆
        {
            //先进小堆,小堆top再进大堆,维持大堆比小堆小
            min_q.push(num);
            max_q.push(min_q.top());
            min_q.pop();
        }
    }
    double findMedian() {
        //如果小堆size大于大堆,返回小堆堆顶
        //如果两个堆size相等,返回两个堆堆顶的值*0.5(中位数)
        return max_q.size() < min_q.size() ? min_q.top() : (max_q.top() + min_q.top()) * 0.5;
    }
};
/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */


过啦!!!


写在最后:

以上就是本篇文章的内容了,感谢你的阅读。


如果喜欢本文的话,欢迎点赞和评论,写下你的见解。


如果想和我一起学习编程,不妨点个关注,我们一起学习,一同成长。


之后我还会输出更多高质量内容,欢迎收看。


相关文章
|
2月前
|
存储
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
【LeetCode】剑指 Offer 54. 二叉搜索树的第k大节点
25 1
|
2月前
|
算法 DataX
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
二叉树(中)+Leetcode每日一题——“数据结构与算法”“剑指Offer55-I. 二叉树的深度”“100.相同的树”“965.单值二叉树”
|
2月前
|
算法 定位技术
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
【leetcode】剑指 Offer II 105. 岛屿的最大面积-【深度优先DFS】
24 0
|
2月前
|
Go
golang力扣leetcode 剑指Offer II 114. 外星文字典
golang力扣leetcode 剑指Offer II 114. 外星文字典
31 0
|
2月前
「LeetCode」剑指 Offer 40. 最小的k个数
「LeetCode」剑指 Offer 40. 最小的k个数
35 0
|
2月前
leetcode 剑指 Offer 32 - III. 从上到下打印二叉树 III
leetcode 剑指 Offer 32 - III. 从上到下打印二叉树 III
28 0
|
2月前
leetcode 剑指 Offer 32 - II. 从上到下打印二叉树 II
leetcode 剑指 Offer 32 - II. 从上到下打印二叉树 II
31 0
|
2月前
/leetcode 剑指 Offer 32 - I. 从上到下打印二叉树
/leetcode 剑指 Offer 32 - I. 从上到下打印二叉树
26 0
|
2月前
leetcode 剑指 Offer 40. 最小的k个数
leetcode 剑指 Offer 40. 最小的k个数
23 0
|
2月前
LeetCode 剑指 Offer 28. 对称的二叉树
LeetCode 剑指 Offer 28. 对称的二叉树
21 0