Leetcode 295. Find Median from Data Stream

Problem

The median is the middle value in an ordered integer list. If the size of the list is even, there is no middle value, and the median is the mean of the two middle values.

  • For example, for arr = [2,3,4], the median is 3.
  • For example, for arr = [2,3], the median is (2 + 3) / 2 = 2.5.

Implement the MedianFinder class:

  • MedianFinder() initializes the MedianFinder object.
  • void addNum(int num) adds the integer num from the data stream to the data structure.
  • double findMedian() returns the median of all elements so far. Answers within 10-5 of the actual answer will be accepted.

Algorithm

Use two heap to save the data, each save half of the total data.

Code

python3 复制代码
class MedianFinder:

    def __init__(self):
        self.small_heap = []
        self.large_heap = []
        self.heap_size = 0

    def addNum(self, num: int) -> None:
        heapq.heappush(self.small_heap, -num)
        if self.large_heap and (self.large_heap[0] > -self.large_heap[0]):
            heapq.heappush(self.large_heap, -heapq.heappop(self.small_heap))
            heapq.heappush(self.small_heap, -heapq.heappop(self.large_heap))
        if self.heap_size % 2 == 0:
            heapq.heappush(self.large_heap, -heapq.heappop(self.small_heap))
        self.heap_size += 1

    def findMedian(self) -> float:
        if not self.heap_size:
            return None
        if self.heap_size % 2 == 0:
            return (self.large_heap[0] - self.small_heap[0]) / 2
        else: 
            return self.large_heap[0]


# Your MedianFinder object will be instantiated and called as such:
# obj = MedianFinder()
# obj.addNum(num)
# param_2 = obj.findMedian()
相关推荐
鱼香rose__几秒前
2024icpc南京站
算法
夜半罟霖1 分钟前
算法手撕面经系列(1)--手撕多头注意力机制
python·深度学习·算法
重生成为码农‍6 分钟前
Java高级Day40-QQ项目全代码
java·开发语言·算法
小冉在学习38 分钟前
leetcode刷题day13|二叉树Part01(递归遍历、迭代遍历、统一迭代、层序遍历)
算法·leetcode·职场和发展
我就想睡到自然醒38 分钟前
《UniVS: Unified and Universal Video Segmentation with Prompts as Queries》要点提炼
人工智能·算法·机器学习
A.A呐1 小时前
LeetCode 692.前K个高频单词
c++·算法·leetcode
小冉在学习1 小时前
leetcode刷题day17|二叉树Part05(654.最大二叉树、617.合并二叉树、700.二叉搜索树中的搜索、98.验证二叉搜索树)
数据结构·算法·leetcode
_Power_Y1 小时前
JavaSE:4、流程控制
java·开发语言·算法
Once_day1 小时前
代码训练LeetCode(18)多数元素
算法·leetcode
zzt_is_me2 小时前
c++的静态成员
java·c++·算法