LeetCode—295. 数据流的中位数(困难)

295. 数据流的中位数(困难)

题目描述:
中位数是有序列表中间的数。如果列表长度是偶数,中位数则是中间两个数的平均值。
例如,
[2,3,4] 的中位数是 3
[2,3] 的中位数是 (2 + 3) / 2 = 2.5

设计一个支持以下两种操作的数据结构:
void addNum(int num) - 从数据流中添加一个整数到数据结构中。
double findMedian() - 返回目前所有元素的中位数。
在这里插入图片描述

考察重点利用sort.IntSlice完成数组的排序并实现小顶堆,继承IntSlice完成数组的逆序并实现大顶堆;
大小顶堆配合查询中位数;声明大顶堆存放较小的一半元素,堆顶存放上半区最大元素;小顶堆存放较大的一半元素,堆顶存放下半区最小元素;中位数即是二者均值或大顶堆堆顶元素。
go实现大小顶堆

package DataStructureimport ("sort"
)//真小顶堆
type MinHeap struct {sort.IntSlice
}func NewMinHeap() *MinHeap {return &MinHeap{IntSlice: sort.IntSlice{}}
}func (h *MinHeap) Push(a interface{}) {h.IntSlice = append(h.IntSlice, a.(int))
}func (h *MinHeap) Pop() interface{} {a := h.IntSlicev := a[len(a)-1]h.IntSlice = a[:len(a)-1]return v
}type ReverseIntSlice []intfunc (x ReverseIntSlice) Len() int           { return len(x) }
func (x ReverseIntSlice) Less(i, j int) bool { return x[i] > x[j] }
func (x ReverseIntSlice) Swap(i, j int)      { x[i], x[j] = x[j], x[i] }type MaxHeap struct {ReverseIntSlice
}func NewMaxHeap() *MaxHeap {return &MaxHeap{ReverseIntSlice: ReverseIntSlice{}}
}func (h *MaxHeap) Push(a interface{}) {h.ReverseIntSlice = append(h.ReverseIntSlice, a.(int))
}func (h *MaxHeap) Pop() interface{} {a := h.ReverseIntSlicev := a[len(a)-1]h.ReverseIntSlice = a[:len(a)-1]return v
}//这只是一个用sort方法仿制的堆,耗时仍然等于对一个数组进行排序
type Heap struct {HeapItem sort.IntSlice
}func NewHeap() (h *Heap) {return &Heap{HeapItem: sort.IntSlice{}}
}func (h *Heap) Push(a int) {h.HeapItem = append(h.HeapItem, a)sort.Sort(h.HeapItem)
}func (h *Heap) Pop() int {temp := h.HeapItem[0]h.HeapItem = h.HeapItem[1:]return temp
}

实现中位数查找

package leetcodeProjectimport ("container/heap"d "DataStructure"
)type MedianFinder struct {MaxItem *d.MaxHeap		//声明一个大顶堆,一个小顶堆   大顶堆用来存放前一半比较小的数,小顶堆用来存放后一半比较大的数,即小顶堆堆顶大于大顶堆堆顶MinItem *d.MinHeap
}func Constructor6() MedianFinder {return MedianFinder{MaxItem: d.NewMaxHeap(), MinItem: d.NewMinHeap()}
}/**先将新元素加入大顶堆,再将大顶堆堆顶元素(最大值)加入小顶堆始终保证大顶堆元素==小顶堆元素||小顶堆元素+1否则,将小顶堆堆顶(最小值)加入大顶堆比如 3,4,1,23 3加入大堆 3加入小堆 “小堆多于大堆” 3加入大堆    小:   大:34 4加入大堆 4加入小堆 “小堆等于大堆” 		     小:4  大:31 1加入大堆 3加入小堆 “小堆多于大堆” 3加入大堆	  小:4  大:1 32 2加入大堆 3加入小堆 “小堆等于大堆” 			 小:4 3 大:1  2
*/
func (h *MedianFinder) AddNum(num int) {heap.Push(h.MaxItem, num)heap.Push(h.MinItem, heap.Pop(h.MaxItem).(int))if h.MaxItem.Len() < h.MinItem.Len() {heap.Push(h.MaxItem, heap.Pop(h.MinItem).(int))}
}func (h *MedianFinder) FindMedian() float64 {if h.MaxItem.Len() == h.MinItem.Len() {return float64(h.MaxItem.ReverseIntSlice[0]+h.MinItem.IntSlice[0]) / 2}return float64(h.MaxItem.ReverseIntSlice[0])
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/263322.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Atlas Samples Suse Linux 10.1

http://asyncpostback.com/ 这是一个展示Altas的相关Features的例子网站,网站的所有例子都有代码,是学习Altas的绝好教程Novell 发布了 SUSE Linux 10.1. 这个版本包含完整的Mono 开发环境和许多基于Mono的桌面应用. 对于专注于.net开发的你非常有必要来了解Mono.因为Mono的支持…

sudo apt-get update 与 sudo apt-get upgrate 的区别

1.sudo gedit /etc/apt/sources.list 源列表里面放置的一行行网址&#xff0c;在这个文件里加入或者注释&#xff08;加#&#xff09;掉一些源后&#xff0c;保存。这时候&#xff0c;我们的源列表里指向的软件就会增加或减少一部分 2. sudo apt-get update 这个命令&#xff…

oracle索引建立

1、明确地创建索引create index index_name on table_name(field_name)tablespace tablespace_namepctfree 5initrans 2maxtrans 255storage(minextents 1maxextents 16382pctincrease 0);2、创建基于函数的索引常用与UPPER、LOWER、TO_CHAR(date)等函数分类上&#xff0c;例&a…

android 中使用AsyncTask实现简单的异步编程

在开发移动客户端的时候往往要使用多线程来进行操作&#xff0c;我们通常会将耗时的操作放在单独的线程执行&#xff0c;避免其占用主线程而给用户带来不好的用户体验。但是在子线程中无法去操作主线程&#xff08;UI 线程&#xff09;&#xff0c;在子线程中操作UI线程会出现错…

网页制作秘招

第一招&#xff1a;有些主页&#xff0c;若把鼠标指向某个链接&#xff0c;在状态栏会出现该链接的说明&#xff0c;是不是会感觉很方便&#xff1f;其实这不难做到&#xff0c;只要在链接语句中加入以下的内容&#xff0c;就可以实现了&#xff01;试试看&#xff01;〈HTML〉…

LeetCode—52. N皇后 II(困难)

52. N皇后 II&#xff08;困难&#xff09; 题目描述&#xff1a; n 皇后问题研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。即令其中任意两个皇后都不同列、同行和在一条斜线上。 给你一个整数 n &#xff0c;返回 n 皇后问题不…

win10 子系统 ubuntu 16.04 安装 docker

2&#xff0c;更新系统软件 $ sudo apt-get update 3&#xff0c;安装依赖包 $ sudo apt-get install \apt-transport-https \ca-certificates \curl \software-properties-common 4&#xff0c;添加官方密钥 执行该命令时&#xff0c;如遇到长时间没有响应说明网络连接不到doc…

解析 Page.MaintainScrollPositionOnPostBack 属性

ASP.NET 的页面执行 PostBack 动作时&#xff0c;页面由伺服端重新传给客户端&#xff0c;而页面的垂直滚动条会跳回最上方&#xff0c;水平滚动条会跳回最左方。为了解决此情形&#xff0c;只要将 Page 的MaintainScrollPositionOnPostBack 属性设为True 时&#xff0c;页面就…

创建WebPart时的数据库连接问题。

ASP.NET加入的WebPart功能确实令人眼前一亮&#xff0c;问题如下&#xff1a;当我拖动一个WebPartManager到页面后&#xff0c;编译运行&#xff0c;竟然出现如下错误&#xff1a; 引用 “/WebSite1”应用程序中的服务器错误。 ----------------------------------------------…

Java创建大小顶堆

——实现模拟的大小顶堆&#xff08;优先队列与TreeMap&#xff09; 以Java中可自排序的数据结构&#xff0c;实现加入元素后&#xff0c;堆顶保持最大/最小 优先队列 ​ PriorityQueue是优先队列&#xff0c;作用是保证每次取出的元素都是队列中权值最小的&#xff0c;这里…

strcpy函数的实现

大家一般觉得名不见经传strcpy函数实现不是非常难&#xff0c;流行的strcpy函数写法是&#xff1a; char *my_strcpy(char *dst,const char *src) {assert(dst ! NULL);assert(src ! NULL);char *ret dst;while((* dst * src) ! \0) ;return ret; }假设注意到&#xff1a; 1&…

Maven 3-Maven依赖版本冲突的分析及解决小结

摘自&#xff1a; https://www.cnblogs.com/aspirant/p/8532962.html 举例A依赖于B及C&#xff0c;而B又依赖于X、Y&#xff0c;而C依赖于X、M&#xff0c;则A除引B及C的依赖包下&#xff0c;还会引入X&#xff0c;Y&#xff0c;M的依赖包&#xff08;一般情况下了&#xff0c;…

阮一峰:jQuery官方基础教程笔记

原文地址&#xff1a;http://www.jobbole.com/entry.php/1151 jQuery是目前使用最广泛的javascript函数库。  据统计&#xff0c;全世界排名前100万的网站&#xff0c;有46%使用jQuery&#xff0c;远远超过其他库。微软公司甚至把jQuery作为他们的官方库。  对于网页开发者…

LeetCode—297. 二叉树的序列化与反序列化(困难)

297. 二叉树的序列化与反序列化&#xff08;困难&#xff09; 题目描述&#xff1a; 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;…

MIME类型不可小视

在完成一个在线播放模块的时候,遇到麻烦,使用一个空页面,采用流方式读取媒体文件,然后将此页面作为文件名赋给网页播放器的FileName属性.结果是常用流媒体格式的文件播放正常,类似于ram,avi,asf这些格式的文件不能播放,报出来的错误也是说文件不可识别.查看详细信息只给出一个标…

一个简单粗暴的前后端分离方案

项目背景 刚刚参加完一个项目&#xff0c;背景&#xff1a;后端是用java&#xff0c;后端服务已经开发的差不多了&#xff0c;现在要通过web的方式对外提供服务&#xff0c;也就是B/S架构。后端专注做业务逻辑&#xff0c;不想在后端做页面渲染的事情&#xff0c;只向前端提供数…

Jena Fuseki安装完成后不能添加数据库

问题描述&#xff1a;安装Jena成功后可以进入管理页面&#xff0c;无法通过界面选择和查询数据 解决方案&#xff1a; 进入 apache-jena-fuseki-3.12.0\run 修改 shiro.ini 配置文件 注释 /$/** localhostFilter&#xff0c;然后重启 转载于:https://www.cnblogs.com/bincodin…

python的setup()与py2exe

自己从事的工作涉及到Python&#xff0c;而之前从来没用过&#xff0c;只好从头学&#xff0c;其实看Python的代码还挺容易看懂的&#xff0c;只是要自己写就很难。 下面是看源码时遇到的一段代码&#xff1a; from distutils.core import setupimport py2exesetup(console[Pyt…

LeetCode—54. 螺旋矩阵

54. 螺旋矩阵 题目描述&#xff1a; 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 考察重点&#xff1a;使用全局变量way数组&#xff0c;配合变量n记录走的方向&#xff1b;nowX&#xff0c;nowY记录当前位置&am…

iBATIS.NET 学习笔记(八)

在iBATIS.NET 学习笔记(五)中的DataGrid中加入删除功能&#xff0c;删除客户信息。修改Maps/Customers.xml,在statements标记中加入下面代码&#xff1a;<delete id"DeleteCustomer"parameterClass"string">delete from Customers where CustomerID#…