首页 > Running Median
头像 LB_tq
发表于 2020-04-08 10:59:28
Solution 经典的动态维护序列中位数问题。 采用对顶堆做法:维护一个大根堆和一个小根堆,其中大根堆维护当前序列中较小的一半元素,小根堆维护较大的一半元素。依次插入每个元素: 若当前元素小于小根堆堆顶,则插入大根堆。 若当前元素大于等于小根堆堆顶,则插入小根堆。 每插入一个元素,检查当前两个 展开全文
头像 sunrise__sunrise
发表于 2020-04-08 21:21:06
题面大意:输入一串数,每次输入到奇数个数时,输出这奇数个 数的中位数。 戳我传送 解前吐槽: 这个题目本来是水题,随便混都可以A的,不管是sort还是nth_element都可以A,说明原题之水,不过被选来的当每日一题的好题目,我们帅气可爱的牛客运营大大们,直接给题目来了波数据史诗级加强,搞得本人 展开全文
头像 塞蒙尘
发表于 2020-04-08 11:47:23
Solution 权值线段树求区间第k小裸题。先对给定的数列进行离散化(或动态开点),然后逐个插入线段树中,当下标为奇数时,利用线段树找到第小的数即可。 题目难度主要在读题上。 总复杂度 Code #include <bits/stdc++.h> using namespace std; 展开全文
头像 Alan233
发表于 2020-04-08 21:16:44
Running Median 题目链接:Running Median Description 给定一个数列 ,你需要输出前个数中的中位数分别是多少。多组数据。数据范围 Solution 我们先考虑暴力。对于前个数,我们可以用一个桶来记录一下所有数的出现情况,然后取第个数即可。考虑如何优化暴力。我 展开全文
头像 WA_TLE
发表于 2020-04-08 17:25:01
对无序数组求中位数,是一个比较经典的问题了。有很多种办法求。这题是边添加边求中位数的。所以每插入一个数就sort一遍复杂度太高显然不行。还有一种利用大根堆小根堆,即平衡树来求,这种可以,这里不说。说另一种复杂度相当的,当常数教小的。利用树状数组来求第K小。建一个权值树状数组。例如有3,4,5,5,6 展开全文
头像 在刷题的单身狗很开心
发表于 2023-09-13 21:46:29
使用对顶堆可解,左边的堆维护中位数前半部分,右边的堆维护中位数后半部分。在新的数进来的时候判断应该插左边还是右边,然后对左右如果差值超过1进行调整。 这样要么左堆的顶端是中位数,要么当左右相同大小的时候就是两个堆顶的数取平均数。 //对顶堆,以左边为承载多出来的那个中间数的堆 #inclu 展开全文
头像 Kur1su
发表于 2020-04-08 16:23:24
Solution 分析题意,要求我们求出每一个奇数长度前缀的中位数对于每一个奇数长度前缀,设长度为len,求中位值其实就是求区间第(len + 1) / 2大那么显然这就是一道求区间第k大的模板题了我们直接上主席树,秒掉这个问题这里简单介绍下主席树主席树又叫可持久化线段树,它是基于线段树发展而来的一 展开全文
头像 TT珑
发表于 2020-05-05 13:55:45
题目链接:https://ac.nowcoder.com/acm/problem/50940题意:有n个数,每次给一个,让你输出目前已经给你的数的中位数,只在拥有奇数个数字时输出。思路:分析题意知道,每当我们拥有的数量为奇数时,就要输出中位数,暴力一点就是,每当我们有奇数个数字的时候就排一次序,然后 展开全文
头像 HGDB
发表于 2020-04-08 14:14:56
(个人感觉这题最难的地方是看懂题目)ps:没想到有人用sort维护都能ac,可能因为这个加强了数据吧 Solution 题意是:输入奇数个数的时候输出此时输入的数的中间值(本蒟蒻看成了输入的数是奇数),因为可能输入的数有相同的所以可以用multiset保存输入的数,对于每次输出可用迭代器寻找值为中 展开全文
头像 wxyww
发表于 2020-04-08 21:08:20
solution 题目就是要求对于每奇数个数字,输出其中位数。 我们只要维护两个堆,第一个大根堆维护较小的数字,第二个小根堆维护较大的个数字。每当新加入一个数字的时候将其与大根堆的队首比较,并维护两个堆的大小。 要求的中位数就是大根堆里的最大值。 code /* * @Author: wxyww * 展开全文