Find Median from Data Stream

题目来源
设计一个数据结构找中位数。
我一开始想的是用一个vector,然后addNum的时候,二分,找到合适的位置,插入,维持一个有序的状态,可以AC,但是比较麻烦,代码也比较长。
代码如下:

class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {
        
    }
    
    void addNum(int num) {
        int n = nums.size();
        if (n == 0) {
            nums.push_back(num);
            return;
        }
        int l = 0, r = n - 1;
        int mid;
        while (l <= r) {
            mid = (l + r) / 2;
            if (nums[mid] == num) {
                nums.insert(nums.begin()+mid+1, num);
                return;
            }
            else if (nums[mid] > num)
                r = mid - 1;
            else
                l = mid + 1;
        }
        if (nums[mid] > num)
            nums.insert(nums.begin()+mid, num);
        else
            nums.insert(nums.begin()+mid+1, num);
    }
    
    double findMedian() {
        int n = nums.size();
        int mid = (n - 1) / 2;
        if (n % 2 != 0)
            return nums[mid];
        else
            return (nums[mid] + nums[mid+1]) / 2.0;
    }
    
private:
    vector<int> nums;
};

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

看了下讨论区,可以直接用优先队列来做,代码如下:

class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {
        
    }
    
    void addNum(int num) {
        small.push(num);//注意这里每个元素需要先入small再入large,否则可能导致大的在small,如1,2,3
        large.push(-small.top());
        small.pop();
        if (large.size() > small.size()) {
            small.push(-large.top());
            large.pop();
        }
    }
    
    double findMedian() {
        if ((small.size() + large.size()) % 2 == 0)
            return (small.top() - large.top()) / 2.0;
        else
            return small.top();
    }
    
private:
    priority_queue<int> small, large;
};

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容