题目解析:视频推荐的算法 | 豆包MarsCode AI刷题

70 阅读2分钟

问题描述

西瓜视频正在开发一个新功能,旨在将访问量达到80百分位数以上的视频展示在首页的推荐列表中。实现一个程序,计算给定数据中的80百分位数。

例如:假设有一个包含从1到100的整数数组,80百分位数的值为80,因为按升序排列后,第80%位置的数字就是80。

99 百分位数:假如有 N 个数据,将数据从小到大排列,99 百分位数是第 N99%位置处的数据(遇到小数时四舍五入获取整数)。一般计算逻辑是先排序,定位到 N99%的位置。返回该位置处的数据。同理,80 百分位数就是第 N*80%位置处的数据。

问题解析

西瓜视频的新功能要求计算 80百分位数,也就是在一组数据中,按升序排列后,前 80% 数据中的最大值。具体来说:

  • 如果有 NNN 个数据:

    1. 按升序排列。
    2. 确定位置索引:k=⌈N×0.8⌉k = \lceil N \times 0.8 \rceilk=⌈N×0.8⌉。
    3. 提取排序数组中索引 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

  1. 数据解析
    原始数据:"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
  2. 排序数组
    升序排列后: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
  3. 计算位置索引
    数据长度 N=10N = 10N=10,计算位置 k=⌈10×0.8⌉=8k = \lceil 10 \times 0.8 \rceil = 8k=⌈10×0.8⌉=8。
  4. 提取结果
    排序数组中第 k−1=7k-1 = 7k−1=7 处的值是 888。

时间与空间复杂度

  1. 时间复杂度

    • 排序操作:O(Nlog⁡N)O(N \log N)O(NlogN)
    • 数据解析:O(N)O(N)O(N)
    • 总复杂度为:O(Nlog⁡N)O(N \log N)O(NlogN)。
  2. 空间复杂度

    • 主要为存储整数数组,空间复杂度为 O(N)O(N)O(N)

image.png