问题描述
西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。
例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。
99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。
问题解析
西瓜视频的新功能要求计算 80百分位数,也就是在一组数据中,按升序排列后,前 80% 数据中的最大值。具体来说:
-
如果有 NNN 个数据:
- 按升序排列。
- 确定位置索引:k=⌈N×0.8⌉k = \lceil N \times 0.8 \rceilk=⌈N×0.8⌉。
- 提取排序数组中索引 k−1k-1k−1 处的值,作为结果。
解决思路
1. 输入解析
- 输入数据通常是一个用逗号分隔的整数列表,例如
"1,2,3,4,5"。 - 首先,将该字符串解析为整数数组。
2. 排序数组
- 为了便于找到百分位数,需要对数组进行升序排序。
3. 确定位置索引
- 按照 k=⌈N×0.8⌉k = \lceil N \times 0.8 \rceilk=⌈N×0.8⌉ 计算。
- 使用四舍五入获取索引的整数值,避免精度问题。
4. 提取结果
- 使用排序数组和索引,直接返回目标值。
示例:数据 10,1,9,2,8,3,7,4,6,510, 1, 9, 2, 8, 3, 7, 4, 6, 510,1,9,2,8,3,7,4,6,5
- 数据解析
原始数据:"10,1,9,2,8,3,7,4,6,5"
转换为数组:10,1,9,2,8,3,7,4,6,510, 1, 9, 2, 8, 3, 7, 4, 6, 510,1,9,2,8,3,7,4,6,5 - 排序数组
升序排列后:1,2,3,4,5,6,7,8,9,101, 2, 3, 4, 5, 6, 7, 8, 9, 101,2,3,4,5,6,7,8,9,10 - 计算位置索引
数据长度 N=10N = 10N=10,计算位置 k=⌈10×0.8⌉=8k = \lceil 10 \times 0.8 \rceil = 8k=⌈10×0.8⌉=8。 - 提取结果
排序数组中第 k−1=7k-1 = 7k−1=7 处的值是 888。
时间与空间复杂度
-
时间复杂度:
- 排序操作:O(NlogN)O(N \log N)O(NlogN)
- 数据解析:O(N)O(N)O(N)
- 总复杂度为:O(NlogN)O(N \log N)O(NlogN)。
-
空间复杂度:
- 主要为存储整数数组,空间复杂度为 O(N)O(N)O(N)