571. 给定数字的频率查询中位数 难度:困难

1、题目描述

571. 给定数字的频率查询中位数 难度:困难_第1张图片
来源:力扣(LeetCode)

2、解题思路

1# 首先,对次数进行累计,计算出数字的总数:
select max(@i:=@i+frequency) as cou from Numbers,(select @i:=0) a
571. 给定数字的频率查询中位数 难度:困难_第2张图片
2# 然后,由总数量,算出两个中位数的位置(如果是奇数,则两个位置相等):
select if (cou%2=0,cou/2+1,cou/2+0.5) as _p1,if (cou%2=0,cou/2,cou/2+0.5) as _p2 from(
select max(@i:=@i+frequency) as cou from Numbers,(select @i:=0) a
)add_count
在这里插入图片描述
3# 这一步,联合Numbers表,使用变量,构造出前一个数字的总数累计,和当前数字的总数累计,判断上一步的_p1或_p2是否落在中间,如果是则提取Numbers,否则取0
select if(@m<_p1 and _p1<=@m:=@m+Frequency,Number,0) as m1, if(@n<_p2 and _p2<=@n:=@n+Frequency,Number,0) as m2 from(
select if (cou%2=0,cou/2+1,cou/2+0.5) as _p1,if (cou%2=0,cou/2,cou/2+0.5) as _p2
from(select max(@i:=@i+frequency) as cou
from Numbers,(select @i:=0) a )add_count
)add_p ,(select * from Numbers order by Number) num_order,(select @m:=0,@n:=0)b
571. 给定数字的频率查询中位数 难度:困难_第3张图片
因为两个中位数都是0,所以不明显。将变量@m取值也一起查询出来,看的更清楚:
select @m as m_befor,if(@m<_p1 and _p1<=@m:=@m+Frequency,Number,0) as m1,@m as m_after
571. 给定数字的频率查询中位数 难度:困难_第4张图片
4# 最后就简单了,因为m1,m2中除了中位数,就是0,所以直接sum
select (sum(m1)+sum(m2))/2 as median

3、提交记录

select (sum(m1)+sum(m2))/2 as median
from(
 	select if(@m<_p1 and _p1<=@m:=@m+Frequency,Number,0) as m1,
 	if(@n<_p2 and _p2<=@n:=@n+Frequency,Number,0) as m2
     from(
  		select if (cou%2=0,cou/2+1,cou/2+0.5) as _p1,if (cou%2=0,cou/2,cou/2+0.5) as _p2
   		from(
			select max(@i:=@i+frequency) as cou
			from Numbers,(select @i:=0) a  
   			)add_count)add_p,
   			(select * from Numbers order by Number) num_order,(select @m:=0,@n:=0)b)add_m

205ms

你可能感兴趣的:(刷题)