【python-leetcode295-双堆】数据流的中位数
时间:2022-07-23
本文章向大家介绍【python-leetcode295-双堆】数据流的中位数,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[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 范围内,你将如何优化你的算法?
需要明确的是:大顶堆中的元素是小顶堆里最小值取负后再加入的,因此大顶堆中(忽略负号)的元素肯定比小顶堆中的小。然后,让小顶堆的长度总是大于或等于大顶堆。因此当长度为奇数时,中位数就是小顶堆的堆首,为偶数时就是(大顶堆堆首+小顶堆堆首)/2
import heapq
class MedianFinder(object):
def __init__(self):
"""
initialize your data structure here.
"""
self.len = 0
#小顶堆
self.minheap = []
#大顶堆
self.maxheap = []
def addNum(self, num):
"""
:type num: int
:rtype: None
"""
#加入一个数,长度加1
self.len += 1
#首先明确的是python中的heapq是小顶堆
#heappushpop:将num放入堆中,然后弹出并返回heap的最小元素。
#heappush:将item的值加入heap中,保持堆的不变性。
#heappop:弹出并返回heap的最小的元素,保持堆的不变性。
heapq.heappush(self.maxheap, -heapq.heappushpop(self.minheap, num))
if len(self.maxheap) > len(self.minheap):
heapq.heappush(self.minheap, -heapq.heappop(self.maxheap))
print("小顶堆:",self.minheap)
print("大顶堆:",self.maxheap)
def findMedian(self):
"""
:rtype: float
"""
if self.len & 1 == 0:
return (self.minheap[0] - self.maxheap[0]) / 2.0
return self.minheap[0]
m=MedianFinder()
m.addNum(4)
print("中位数:",m.findMedian())
m.addNum(1)
print("中位数:",m.findMedian())
m.addNum(5)
print("中位数:",m.findMedian())
m.addNum(2)
print("中位数:",m.findMedian())
m.addNum(7)
print("中位数:",m.findMedian())
过程:负号只是占位用。
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Python字典操作总结
- 纯代码系列:Python实现验证码图片(PIL库经典用法用法,爬虫12306思路)
- Python正则表达式快速学习
- 如何上传项目到GitHub
- MySQL查询优化-基于EXPLAIN
- Python操作SQLite数据库
- Python多进程及多线程基础
- Python字符串三种格式化输出
- 你需要知道的Python代码规范性检查(pylint和flake8)
- Linux下安装python环境
- 【5】进大厂必须掌握的面试题-Java面试-spring
- Python 3.7 自动化接口测试简单实例
- 从 0 开始构建一个亿级请求的微服务架构
- ruby+cucumber+watir环境搭建
- Python常用模块os和shutil学习