AI 刷题 100. 统计班级说谎者 题解 | 豆包MarsCode AI刷题

35 阅读4分钟

问题描述

在小C的班级里,有 N 个学生,每个学生的成绩是 A_i。小C发现了一件有趣的事:当且仅当某个学生的成绩小于或等于自己的有更多人时,这个学生会说谎。换句话说,如果分数小于等于他的学生数量大于比他分数高的学生数量,则他会说谎。

现在,小C想知道班里有多少个学生会说谎。

代码解释

代码的目标是找出一个数组 A 中的 "liars"(可以理解为不符合某种条件的元素)。具体来说,"liar" 是指这样的元素:在数组中,其值与其他元素的相对顺序不符。代码逐一检查每个元素,看它是否有更多的元素小于等于它自身的值,来判断它是否是一个"liar"。

代码逻辑总结

  • 对于数组 A 中的每一个元素 score,我们计算有多少个元素小于等于它 (less_equal_count),以及有多少个元素比它大 (greater_count)。
  • 如果 less_equal_count 大于 greater_count,我们就认为当前元素是一个“liar”。
  • 最终返回的是所有这样的“liar”元素的数量。

问题分析

给定一个整数数组 A,我们需要找出其中的“liars”的数量。所谓“liar”可以定义为在这个数组中,对于某个数 score,如果比它小于等于的元素数量 less_equal_count 大于比它大的元素数量 greater_count,则称该元素为“liar”。

定义

  • 数组中每个元素可以称为一个“liar”,如果:

    • less_equal_count(小于等于该元素的数量) > greater_count(大于该元素的数量)。

目标是找到数组中有多少个元素符合这个条件,即“liar”的数量。

解题思路

  1. 初始化变量

    • 需要一个计数变量 liar_count,用来记录满足条件的“liar”的数量。
    • 获取数组的长度 n,用于后续的计算。
  2. 遍历数组中的每个元素

    • 对于每个元素,计算有多少个元素小于等于它 (less_equal_count)。
    • greater_count 可以通过 n - less_equal_count 计算得出。
  3. 判断条件

    • 对于每个元素,检查 less_equal_count 是否大于 greater_count,如果满足这个条件,则将 liar_count 增加 1
  4. 返回结果

    • 最终返回 liar_count,即为数组中满足“liar”条件的元素数量。

代码实现

def solution(A):
    n = len(A)
    liar_count = 0

    for score in A:

        less_equal_count = sum(1 for x in A if x <= score)

        greater_count = n - less_equal_count

        if less_equal_count > greater_count:
            liar_count += 1

    return liar_count

代码解释

  1. 初始化

    • n = len(A):获取数组的长度。
    • liar_count = 0:初始化“liar”的计数为 0
  2. 遍历数组中的每个元素

    • for score in A:遍历数组中的每个元素 score
  3. 计算小于等于当前元素的数量

    • less_equal_count = sum(1 for x in A if x <= score)

    • 这里使用生成器表达式遍历数组 A,对于每个小于等于 score 的元素,返回 1,然后对所有这些 1 进行求和,得到小于等于 score 的元素数量。

  4. 计算比当前元素大的数量

    • greater_count = n - less_equal_count

      总长度 n 减去小于等于 score 的元素数量,就是比 score 大的元素数量。

  5. 判断条件并更新 liar_count

    • if less_equal_count > greater_count

    • 如果小于等于的数量大于比它大的数量,则 score 被称为“liar”,所以将 liar_count 增加 1

  6. 返回结果

    • return liar_count:返回数组中满足条件的“liar”的数量。

时间复杂度分析

  • 时间复杂度O(n^2),其中 n 是数组 A 的长度。

    • 代码中有一个外层循环 for score in A,遍历数组中的每个元素,这里有 n 次。
    • 在外层循环内部,计算 less_equal_count 的时候使用了 sum(1 for x in A if x <= score),这里也需要遍历整个数组,时间复杂度为 O(n)
    • 因此,总的时间复杂度为 O(n * n) = O(n^2)
  • 空间复杂度O(1),只使用了常数的额外空间。

    • 我们只使用了几个整数变量来存储数组长度、less_equal_countgreater_count、以及“liar”的计数器,所有这些占用的空间都是常数级别的。