LeetCode(剑指 Offer)- 41. 数据流中的中位数

Posted 放羊的牧码

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(剑指 Offer)- 41. 数据流中的中位数相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

题目大意:

解题思路

相关企业

  • 字节跳动
  • 亚马逊(Amazon)
  • 微软(Microsoft)
  • Facebook
  • 苹果(Apple)
  • 谷歌(Google)
  • Indeed
  • 领英(LinkedIn)
  • 优步(Uber)
  • 英伟达(NVIDIA)

AC 代码

  • Java
// 解决方案(1)
class MedianFinder 

    int[] data;
    int len;
    /** initialize your data structure here. */
    public MedianFinder() 
        data = new int[100000];
        len = 0;
    
    
    public void addNum(int num) 
        if (len == 0) 
            data[len++] = num;
            return;
        
        int idx = search(num);
        len++;
        for (int i = len - 1; i > idx; i--) 
            data[i] = data[i - 1];
        
        data[idx] = num;
    
    
    public double findMedian() 
        if (len % 2 == 0) 
            return (data[len / 2 - 1] + data[len / 2]) / 2.0;
         else 
            return data[len / 2];
        
    

    private int search(int val) 
        int l = 0, r = len - 1;
        while (l <= r) 
            int mid = (l + r) / 2;
            if (data[mid] == val) 
                return mid;
             else if (data[mid] < val) 
                l = mid + 1;
                if (l > r) 
                    return l;
                
             else 
                r = mid - 1;
                if (r < l) 
                    return r + 1; // 当 l == r 时, 此时这个场景应该取 r + 1 自己举个例子就知道了
                
            
        
        return -1;
    


// 解决方案(2)
class MedianFinder 
    Queue<Integer> A, B;
    public MedianFinder() 
        A = new PriorityQueue<>(); // 小顶堆,保存较大的一半
        B = new PriorityQueue<>((x, y) -> (y - x)); // 大顶堆,保存较小的一半
    
    public void addNum(int num) 
        if(A.size() != B.size()) 
            A.add(num);
            B.add(A.poll());
         else 
            B.add(num);
            A.add(B.poll());
        
    
    public double findMedian() 
        return A.size() != B.size() ? A.peek() : (A.peek() + B.peek()) / 2.0;
    
  • C++
class MedianFinder 
public:
    priority_queue<int, vector<int>, greater<int>> A; // 小顶堆,保存较大的一半
    priority_queue<int, vector<int>, less<int>> B; // 大顶堆,保存较小的一半
    MedianFinder()  
    void addNum(int num) 
        if(A.size() != B.size()) 
            A.push(num);
            B.push(A.top());
            A.pop();
         else 
            B.push(num);
            A.push(B.top());
            B.pop();
        
    
    double findMedian() 
        return A.size() != B.size() ? A.top() : (A.top() + B.top()) / 2.0;
    
;

以上是关于LeetCode(剑指 Offer)- 41. 数据流中的中位数的主要内容,如果未能解决你的问题,请参考以下文章

《剑指offer》:[41]数组中和为S的两个数

总结leetcode剑指offer分类学习速成

LeetCode1269. 停在原地的方案数 / 剑指 Offer 38. 字符串的排列 / 216. 组合总和 III / 剑指 Offer 39. 数组中出现次数超过一半的数字/229. 求众数(

LeetCode692. 前K个高频单词 / 剑指 Offer 50. 第一个只出现一次的字符 / 剑指 Offer 51. 数组中的逆序对 / 2. 两数相加

[LeetCode]剑指 Offer 49. 丑数

[LeetCode]剑指 Offer 49. 丑数