find median from data stream

  • 问题来源
  • 问题简介

    从一个无序数组中寻找中位数。


解题思路


时间复杂度 空间复杂度
O(未知) O(未知)

Code

#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;
class MedianFinder {
public:
    /** initialize your data structure here. */
    MedianFinder() {

    }

    void addNum(int num) {
        arr.push_back(num);
    }

    double findMedian() {
        int s = size();
        if ((s & 1)) {
            return findKthNum(s / 2 + 1);
        }
        else {
            return (findKthNum(s / 2) + findKthNum(s / 2 + 1)) / 2;
        }
    }
    int size() {
        return arr.size();
    }
private:
    vector<int> arr;
    double findKthNum(int k) {
        int s = size();
        if (s == 0 || k > s) {
            throw "invalid length";
        }
        if (s == 1) {
            return arr[0];
        }
        MedianFinder l, v, r;
        int key = arr[k-1];
        for_each(arr.begin(), arr.end(), [&](int num) {
            if (num < key) {
                l.addNum(num);
            }
            else if (num == key) {
                v.addNum(num);
            }
            else {
                r.addNum(num);
            }
        });
        if (l.size() >= k) {
            return l.findKthNum(k);
        }
        else if (v.size() >= k - l.size()) {
            return key;
        }
        else {
            return r.findKthNum(k - l.size() - v.size());
        }
    }
};

int main() {
    MedianFinder obj;
    obj.addNum(1);
    obj.addNum(3);
    obj.addNum(7);
    obj.addNum(5);
    cout << obj.findMedian() << endl;
    obj.addNum(2);
    cout << obj.findMedian() << endl;
    return 0;
}

运行结果

Find Median from Data Stream