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

题目难度

困难

题目描述

Numbers 表保存数字的值及其频率。
Leetcode_571. 给定数字的频率查询中位数_第1张图片
在此表中,数字为 0, 0, 0, 0, 0, 0, 0, 1, 2, 2, 2, 3,所以中位数是 (0 + 0) / 2 = 0。
在这里插入图片描述

正确答案

SELECT AVG(Number) AS median
FROM
 	(
 	SELECT *, @cum AS nbeg, (@cum := @cum + Frequency)-1 AS nend
 	FROM
	 	(SELECT *
	 	FROM Numbers
	 	ORDER BY Number) t1,
	 	(SELECT SUM(Frequency) as nsum FROM Numbers) s,  
	 	(SELECT @cum := 1) t2
	 ) tmp
WHERE
	CEIL(nsum/2) BETWEEN nbeg AND nend 
	OR
	FLOOR(nsum/2+1) BETWEEN nbeg AND nend;

分析

思想:

  1. 得到所有数字在数列中的起始位置与结束位置
  2. 确定中位数所处位置
  3. 查找中位数处于的数字区间

确定数字位置区间:

  1. 先对Number排序(t1),将数列总数作为新列(nsum)
  2. @cum参数随时更新,记录当前数字的起始排序。nbeg列记录该数字在数列中排序的起始位置,nend记录数字的结束位置。

确定中位数位置:

  • 奇数数列 eg:数列长nsum=3
    CEIL(nsum/2)=CEIL(1.5)=2,FLOOR(nsum/2+1)=FLOOR(2.5)=2
  • 偶数数列 eg:数列长nsum=4
    CEIL(nsum/2)=CEIL(2)=2,FLOOR(nsum/2+1)=FLOOR(3)=3
  • 偶数数列中位数找到两个位置,奇数数列找到一个。

知识点

BETWEEN AND 包含两边界
CEIL 向上取整
FLOOR 向下取整

你可能感兴趣的:(Leetcode_571. 给定数字的频率查询中位数)