Leetcode刷题记之给定数字的频率查询中位数

给定数字的频率查询中位数

题目来源:Leetcode

方法一:

解题思路:中位数顺序 = (总个数+1)/2

解答:

SELECT AVG(number) median
FROM (SELECT a.Number, a.Frequency, SUM(b.frequency) cumttl
     FROM Numbers a,Numbers b
     WHERE a.Number >= b.Number 
     GROUP BY a.Number
     ORDER BY a.Number
) c        
WHERE cumttl =  FLOOR((SELECT (SUM(frequency)+1)/2 num FROM numbers))
OR cumttl =  CEILING((SELECT (SUM(frequency)+1)/2 num FROM numbers))
 

方法二:

解题思路:找出每个number开始和结束的位置,再确定中位数位于哪里 (思路来自leetcode评论区)

① 使用自定义变量,确定开始和结束位置

SELECT number, @a +1 as 'lower',
       (@a:= @a+frequency) as 'upper',
       t2.ttl
FROM numbers,(select @a := 0) t1,
     (select sum(frequency) as 'ttl' from numbers) t2 
ORDER BY number

输出结果:

② 判断中位数位置,求解中位数

SELECT AVG(number) median
FROM (
	SELECT number, @a +1 as 'lower',
		  (@a:= @a+frequency) as 'upper',
		  t2.ttl
	FROM numbers,(select @a := 0) t1,
	    (select sum(frequency) as 'ttl' from numbers) t2 
	ORDER BY number) c
WHERE c.lower <= (c.ttl+1)/2 
AND c.upper >= (c.ttl+1)/2
发布了11 篇原创文章 · 获赞 0 · 访问量 234

猜你喜欢

转载自blog.csdn.net/weixin_44900533/article/details/105576940
今日推荐