From 633720bf77373ca9cbe851b66531a2099404621d Mon Sep 17 00:00:00 2001 From: CyC2018 Date: Wed, 28 Oct 2026 13:45:05 +0800 Subject: [PATCH] =?UTF-8?q?Update=2041.1=20=E6=95=B0=E6=8D=AE=E6=B5=81?= =?UTF-8?q?=E4=B8=AD=E7=9A=84=E4=B8=AD=E4=BD=8D=E6=95=B0.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 题目链接改为力扣中的对应题目,题目描述和代码按该题的接口调整。 --- notes/41.1 数据流中的中位数.md | 58 +++++++++++++++++++--------------- 1 file changed, 33 insertions(+), 25 deletions(-) diff --git a/notes/41.1 数据流中的中位数.md b/notes/41.1 数据流中的中位数.md index 9814db63..1ed76391 100644 --- a/notes/41.1 数据流中的中位数.md +++ b/notes/41.1 数据流中的中位数.md @@ -2,7 +2,7 @@ ## 题目链接 -[牛客网](https://www.nowcoder.com/practice/9be0172896bd43948f8a32fb954e1be1?tpId=13&tqId=11216&tPage=1&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking&from=cyc_github) +[Leetcode](https://leetcode.cn/problems/shu-ju-liu-zhong-de-zhong-wei-shu-lcof/) ## 题目描述 @@ -11,32 +11,40 @@ ## 解题思路 ```java -/* 大顶堆,存储左半边元素 */ -private PriorityQueue left = new PriorityQueue<>((o1, o2) -> o2 - o1); -/* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */ -private PriorityQueue right = new PriorityQueue<>(); -/* 当前数据流读入的元素个数 */ -private int N = 0; +class MedianFinder { + + /* 大顶堆,存储左半边元素 */ + private PriorityQueue left = new PriorityQueue<>((o1, o2) -> o2 - o1); + /* 小顶堆,存储右半边元素,并且右半边元素都大于左半边 */ + private PriorityQueue right = new PriorityQueue<>(); + /* 当前数据流读入的元素个数 */ + private int N = 0; + + public MedianFinder() { -public void Insert(Integer val) { - /* 插入要保证两个堆存于平衡状态 */ - if (N % 2 == 0) { - /* N 为偶数的情况下插入到右半边。 - * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大, - * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */ - left.add(val); - right.add(left.poll()); - } else { - right.add(val); - left.add(right.poll()); } - N++; -} -public Double GetMedian() { - if (N % 2 == 0) - return (left.peek() + right.peek()) / 2.0; - else - return (double) right.peek(); + public void addNum(int num) { + /* 插入要保证两个堆存于平衡状态 */ + if (N % 2 == 0) { + /* N 为偶数的情况下插入到右半边。 + * 因为右半边元素都要大于左半边,但是新插入的元素不一定比左半边元素来的大, + * 因此需要先将元素插入左半边,然后利用左半边为大顶堆的特点,取出堆顶元素即为最大元素,此时插入右半边 */ + left.add(num); + right.add(left.poll()); + } else { + right.add(num); + left.add(right.poll()); + } + N++; + } + + public double findMedian() { + if (N % 2 == 0) { + return (left.peek() + right.peek()) / 2.0; + } else { + return (double) right.peek(); + } + } } ```