LeetCode(数据库)- 给定数字的频率查询中位数

Posted Lux_Sun

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode(数据库)- 给定数字的频率查询中位数相关的知识,希望对你有一定的参考价值。

题目链接:点击打开链接

 

题目大意:略。

 

解题思路:

  • 解决方案(1):如果 n1.Number 为中位数,n1.Number(包含本身)前累计的数字应大于等于总数/2;同时n1.Number(不包含本身)前累计数字应小于等于总数/2,至于为什么代码里第二个 SUM 里要减去"-AVG(n1.Frequency)",是因为这样就能算出单个 n1.Frequency 值,因为在分组里所有 n1.Frequency 都一样,一平均就是单个自己的 n1.Frequency,只要找到这个规律就KO了。
  • 解决方案(2):使用 sum over(order by) 对数字个数进行正序和逆序累计,当某一数字的 正序和逆序累计 均大于 整个序列的数字个数的一半 时即为中位数,将最后选定的一个或两个中位数进行求均值即可。

    image.png

 

AC 代码

-- 解决方案(1)
SELECT AVG(Number) median 
FROM
(SELECT n1.Number FROM Numbers n1 JOIN Numbers n2 ON n1.Number>=n2.Number 
 GROUP BY 
 n1.Number 
 HAVING 
 SUM(n2.Frequency)>=(SELECT SUM(Frequency) FROM Numbers)/2 
 AND 
 SUM(n2.Frequency)-AVG(n1.Frequency)<=(SELECT SUM(Frequency) FROM Numbers)/2
) rs;


-- 解决方案(2)
select avg(number) median
from
    (select number,
        sum(frequency) over(order by number) asc_accumu,
        sum(frequency) over(order by number desc) desc_accumu
        from numbers) t1, 
    (select sum(frequency) total from numbers) t2
where asc_accumu >= total/2 and desc_accumu >=total/2

以上是关于LeetCode(数据库)- 给定数字的频率查询中位数的主要内容,如果未能解决你的问题,请参考以下文章

leetcode中等2080区间内查询数字的频率

leetcode中等2080区间内查询数字的频率

LeetCode 2080. 区间内查询数字的频率

[SQL]给定数字的频率查询中位数

有没有办法使用线段树在给定范围内查找数字的频率?

LeetCode 1224 最大相等频率[模拟 Map] HERODING的LeetCode之路