gold-17-20


随机产生数字并传递给一个方法。你能否完成这个方法,在每次产生新值时,寻找当前所有值的中间值(中位数)并保存。

中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。

例如,

[2,3,4] 的中位数是 3

[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:

  • void addNum(int num) - 从数据流中添加一个整数到数据结构中。
  • double findMedian() - 返回目前所有元素的中位数。

示例:

addNum(1)
addNum(2)
findMedian() -> 1.5
addNum(3) 
findMedian() -> 2

//leetcode submit region begin(Prohibit modification and deletion)
class MedianFinder {

    List<Integer> arr;

    /** initialize your data structure here. */
    public MedianFinder() {
        arr = new ArrayList<>();
    }

    public void addNum(int num) {
        if (arr.size() == 0) {
            arr.add(num);
            return;
        }

        int start = 0;
        int end = arr.size() - 1;

        while (start <= end) {
            if (start == end) {
                if (arr.get(start) > num) {
                    arr.add(start, num);
                } else {
                    arr.add(start + 1, num);
                }
                break;
            } else if (start + 1 == end) {
                if (arr.get(start) > num) {
                    arr.add(start, num);
                } else if (arr.get(end) > num) {
                    arr.add(end, num);
                } else {
                    arr.add(end + 1, num);
                }
                break;
            } else {
                int mid = start + (end - start) / 2;

                if (arr.get(mid) < num) {
                    start = mid;
                } else {
                    end = mid;
                }
            }
        }
    }

    public double findMedian() {
        if (arr.size() == 0) {
            return 0.0;
        }
        if (arr.size() % 2 == 1) {
            return (double)(arr.get(arr.size() / 2));
        } else {
            return (double)(arr.get(arr.size() / 2 - 1) + arr.get(arr.size() / 2)) / 2;
        }
    }
}

/**
 * Your MedianFinder object will be instantiated and called as such:
 * MedianFinder obj = new MedianFinder();
 * obj.addNum(num);
 * double param_2 = obj.findMedian();
 */
//leetcode submit region end(Prohibit modification and deletion)

文章作者: 倪春恩
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 倪春恩 !