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) 对数字个数进行正序和逆序累计,当某一数字的 正序和逆序累计 均大于 整个序列的数字个数的一半 时即为中位数,将最后选定的一个或两个中位数进行求均值即可。
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(数据库)- 给定数字的频率查询中位数的主要内容,如果未能解决你的问题,请参考以下文章