首页 > 其他分享 >剑指 Offer 41. 数据流中的中位数 - 力扣(Leetcode)

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

时间:2022-11-13 16:14:45浏览次数:69  
标签:q1 大根堆 q2 Offer 元素 41 力扣 num size

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

分析

维护两个堆,一个大根堆,一个小根堆。

  1. 插入操作:
    当进行插入时,先判断大根堆中是否有元素,如果没有直接插入大根堆,若有元素,将当前插入值与大根堆中的堆顶元素比较,如果当前值较小,那么直接插入大根堆。若当前值大于等于堆顶元素,则将其插入小根堆。
  2. 查询操作:
    查询时,我们需要保证大根堆与小根堆的元素个数相等或相差一。因为只有这样,堆顶元素才是中位数。因此我们先循环判断大根堆中的元素个数与小根堆中元素个数之差是否大于1。若大于一,则取出大根堆顶的元素,插入小根堆。然后循环判断小根堆元素个数是否大于大根堆,若大于,则取出插入大根堆。当完成这两个循环后,大根堆的元素个数应该是与小根堆相等或大一。若大一,则直接返回大根堆顶元素,否则返回大根堆顶元素和小根堆顶元素的平均数。

代码

优先队列
class MedianFinder {
public:
    /** initialize your data structure here. */
    priority_queue<int> q1;
    priority_queue<int,vector<int>, greater<int> > q2;
    MedianFinder() {

    }
    
    void addNum(int num) {
        if (q1.size()==0)
        {
            q1.push(num);
            return;
        }
        if (num>q1.top())
            q2.push(num);
        else
            q1.push(num);
        return;
    }
    
    double findMedian() {
        while (q1.size()>q2.size()+1)
        {
            int k=q1.top();
            q1.pop();
            q2.push(k);
        }
        while (q2.size()>q1.size())
        {
            int k=q2.top();
            q2.pop();
            q1.push(k);
        }
        if (q1.size()==q2.size())
        {
            return (q1.top()+q2.top())/2.0;
        }
        else
            return q1.top();
    }
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder* obj = new MedianFinder();
 * obj->addNum(num);
 * double param_2 = obj->findMedian();
 */

标签:q1,大根堆,q2,Offer,元素,41,力扣,num,size
From: https://www.cnblogs.com/sjw-blogs/p/16886136.html

相关文章

  • 2022-2023-1 20221419 《计算机基础与程序设计》第11周学习总结
    2022-2023-120221419《计算机基础与程序设计》第11周学习总结作业信息班级:[2022-2023-1-计算机基础与程序设计]https://edu.cnblogs.com/campus/besti/2022-2023-1-CFA......
  • 力扣35(java&python)-搜索插入位置(简单)
    题目:给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。请必须使用时间复杂度为O(logn)的算法......
  • 剑指 Offer 59 - I. 滑动窗口的最大值 - 力扣(Leetcode)
    剑指Offer59-I.滑动窗口的最大值-力扣(Leetcode)一.分析方法一:数组长度为1e5,k的大小为1e4,因此直接暴力计算会TLE。我们可以思考一个更复杂的问题:询问任意区间中的......
  • 洛谷 P4135 作诗 题解
    题面。之前做过一道很类似的题目洛谷P4168蒲公英,然后看到这题很快就想到了解法,做完这题可以对比一下,真的很像。题目要求区间内出现次数为正偶数的数字的数量。数据范......
  • 20221410 《计算机基础与程序设计》第十一周学习总结
    作业信息|这个作业属于哪个课程|<班级的链接>(https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP))||这个作业要求在哪里|<作业要求的链接>(https://edu.cnblogs.co......
  • 洛谷P4168 蒲公英 分块处理区间众数模板
    题面。许久以前我还不怎么去机房的时候,一位大佬好像一直在做这道题,他称这道题目为“大分块”。其实这道题目的思想不只可以用于处理区间众数,还可以处理很多区间数值相关......
  • 2022-2023-1学期 20221417 《计算机基础与程序设计》第11周学习总结
    作业信息这个作业属于哪个课程<班级的链接>(如2022-2023-1-计算机基础与程序设计)这个作业要求在哪里<作业要求的链接>(如2022-2023-1计算机基础与程序设计第十一......
  • 力扣707 设计链表
    题目:设计链表的实现。您可以选择使用单链表或双链表。单链表中的节点应该具有两个属性:val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果要使用双......
  • leetcode441
    排列硬币Category Difficulty Likes Dislikesalgorithms Easy(45.89%) 248 -TagsCompanies你总共有n枚硬币,并计划将它们按阶梯状排列。对于一个由k行组成的阶梯,......
  • 力扣-647-回文子串
    因为单字符也算是回文,所以至少有n个然后感觉又是二维dp感觉很像回溯解决排列组合问题感觉难点在于还要判断是不是回文,虽然可以借助栈,但是每次都压栈弹栈肯定复杂度太大......