数组子序列 |豆包MarsCode AI刷题

19 阅读3分钟

小U手里有一个由 n n个正整数组成的数组。她希望能够从中找到一个子序列,使得这个子序列的平均数大于一个给定的值 k k。你的任务是帮助小U找到这样的子序列,并且求出其中最长的子序列长度。如果无法找到平均数大于 k k的子序列,那么输出 − 1 −1。 例如:给定数组为 [3, 1, 1, 2, 3],并且 k k为2。你可以选择子序列 [3, 1, 2, 3],此时它的平均数为2.25,大于 k k,并且这是最长的满足条件的子序列。

  1. 初始化最长子序列长度变量

    • 首先初始化变量 max_length 为 -1,用于记录满足平均数大于给定值 k 的最长子序列长度。初始化为 -1 是为了方便后续判断是否找到了满足条件的子序列,如果最终还是 -1,则表示没有找到符合要求的子序列。
  2. 双重循环遍历所有子序列情况

    • 通过两层嵌套的循环来遍历数组 a 的所有子序列情况。外层循环控制子序列的起始位置 start,范围从 0 到 n - 1n 为数组长度),表示从数组的第一个元素开始逐步往后确定子序列的起始位置。内层循环控制子序列的结束位置 end,范围从 start 到 n - 1,这样可以确保内层循环每次确定的子序列都是从外层循环指定的起始位置开始往后延伸的,涵盖了所有可能的子序列情况。
    • 对于每一组 start 和 end 确定的子序列,通过切片操作 a[start:end + 1] 获取该子序列 sub_a,然后计算子序列的元素总和 sub_sum(使用 Python 的内置函数 sum),再计算子序列的平均数 sub_avg(通过 sub_sum 除以子序列长度 len(sub_a) 得到)。
  3. 判断子序列平均数并更新最长子序列长度

    • 计算出子序列的平均数 sub_avg 后,判断它是否大于给定值 k,如果大于 k,说明找到了一个满足条件的子序列,此时将该子序列的长度 len(sub_a) 与当前记录的最长子序列长度 max_length 进行比较,使用 max 函数取两者中的较大值来更新 max_length,这样不断遍历和比较更新,就能找到所有满足条件的子序列中最长的那个长度。
  4. 返回最终结果

    • 当两层嵌套循环遍历完所有可能的子序列情况后,max_length 变量中存储的就是满足平均数大于 k 的最长子序列长度,如果整个过程中都没有找到满足条件的子序列,max_length 依然保持初始值 -1,将其返回即可。

时间复杂度方面,外层循环遍历数组的时间复杂度为 (n 为数组长度),内层循环对于每个起始位置又要遍历从该位置到数组末尾的所有情况,时间复杂度为 ,在循环中进行的操作主要是切片、求和以及简单的比较和赋值操作,时间复杂度都是常数级别,综合起来整体时间复杂度为 ,在处理常规长度的数组以及给定的平均数阈值时能够正确地找出最长的满足条件的子序列长度(如果存在的话)。