diff --git a/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.java b/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.java new file mode 100644 index 0000000..a668cb9 --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.java @@ -0,0 +1,102 @@ +//中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。 +// +// 例如, +// +// [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 +// +// 进阶: +// +// +// 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法? +// 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法? +// +// Related Topics 设计 双指针 数据流 排序 堆(优先队列) +// 👍 449 👎 0 + +package leetcode.editor.cn; + +import java.util.*; + +//295:数据流的中位数 +public class FindMedianFromDataStream { + public static void main(String[] args) { + //测试代码 +// Solution solution = new FindMedianFromDataStream().new Solution(); + MedianFinder medianFinder = null; + List list1 = Arrays.asList("MedianFinder", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian", "addNum", "findMedian"); + List list2 = Arrays.asList(null, -1, null, -2, null, -3, null, -4, null, -5, null); + for (int i = 0; i < list1.size(); i++) { + if ("MedianFinder".equals(list1.get(i))) { + medianFinder = new FindMedianFromDataStream().new MedianFinder(); + } else if ("addNum".equals(list1.get(i))) { + medianFinder.addNum(list2.get(i)); + } else { + System.out.println(medianFinder.findMedian()); + } + } + } + + //力扣代码 + //leetcode submit region begin(Prohibit modification and deletion) + class MedianFinder { + + /** + * 当前大顶堆和小顶堆的元素个数之和 + */ + private int count; + private PriorityQueue max; + private PriorityQueue minheap; + + /** + * initialize your data structure here. + */ + public MedianFinder() { + count = 0; + max = new PriorityQueue<>((x, y) -> y - x); + minheap = new PriorityQueue<>(); + } + + public void addNum(int num) { + count += 1; + max.offer(num); + minheap.add(max.poll()); + if ((count & 1) != 0) { + max.add(minheap.poll()); + } + } + + public double findMedian() { + if ((count & 1) == 0) { + return (double) (max.peek() + minheap.peek()) / 2; + } else { + return (double) max.peek(); + } + } + } + +/** + * 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) + +} \ No newline at end of file diff --git a/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.md b/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.md new file mode 100644 index 0000000..ff2ddef --- /dev/null +++ b/src/main/java/leetcode/editor/cn/FindMedianFromDataStream.md @@ -0,0 +1,30 @@ +

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

+ +

例如,

+ +

[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
+ +

进阶:

+ +
    +
  1. 如果数据流中所有整数都在 0 到 100 范围内,你将如何优化你的算法?
  2. +
  3. 如果数据流中 99% 的整数都在 0 到 100 范围内,你将如何优化你的算法?
  4. +
+
Related Topics
  • 设计
  • 双指针
  • 数据流
  • 排序
  • 堆(优先队列)
  • \n
  • 👍 449
  • 👎 0
  • \ No newline at end of file