0
点赞
收藏
分享

微信扫一扫

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) 对数字个数进行正序和逆序累计,当某一数字的 正序和逆序累计 均大于 整个序列的数字个数的一半 时即为中位数,将最后选定的一个或两个中位数进行求均值即可。

    LeetCode(数据库)- 给定数字的频率查询中位数_力扣 算法 解题


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


举报

相关推荐

0 条评论