小C点菜问题 | 豆包MarsCode AI刷题

138 阅读4分钟

解题思路详解

1. 问题分析

本题的目标是计算出在满足一定条件下,小C可以点的最多的同价菜的数量。具体条件包括:

  1. 小C只能选择单价不超过 m 的菜。
  2. 小C点的菜必须是价格相同的,即从所有可选菜中找到一个价格,这个价格的菜数量最多。

问题可以被归类为一个带约束的最大值查找问题,具体来说:

  • 输入包括一个整数 m(价格上限)和一个列表 w(所有菜的价格)。
  • 输出为在价格不超过 m 的范围内,出现次数最多的菜的数量。

2. 分析步骤

为了更高效地解决问题,我们需要先对题目中的核心操作进行拆解和分析。

2.1 数据统计

任务:统计每个菜价格的出现次数。

  • 这是一个典型的计数问题,可以使用 Python 的 collections.Counter 数据结构,它可以快速统计列表中每个元素出现的频率,并返回一个字典格式的结果。例如:
    from collections import Counter
    prices = [2, 3, 3, 6, 6, 6]
    count = Counter(prices)
    print(count)  # 输出:Counter({6: 3, 3: 2, 2: 1})
    
2.2 筛选合法价格

任务:过滤出单价不超过 m 的菜。

  • Counter 结果进行遍历,检查每个价格是否满足条件(价格 <= m)。若不满足,则直接跳过。
  • 过滤后,只需关注合法价格的计数值。
2.3 找出最大计数

任务:在合法价格中找到数量最多的菜。

  • 遍历过滤后的数据,记录出现次数的最大值。该值就是小C最多能点的菜的数量。

3. 算法步骤总结

我们可以将问题分解为以下几个明确的步骤:

  1. 使用 Counter 统计每个菜价格的出现次数;
  2. 遍历统计结果,筛选出价格不超过 m 的价格;
  3. 记录符合条件的菜中最大计数值并返回。

4. 算法复杂度分析

  1. 时间复杂度

    • 使用 Counter 对价格列表进行计数的时间复杂度为 ( O(n) ),其中 ( n ) 是价格列表的长度。
    • 遍历 Counter 中的价格键值对的复杂度为 ( O(k) ),其中 ( k ) 是价格的种类数(通常远小于 ( n ))。
    • 因此总的时间复杂度为 ( O(n + k) )。
  2. 空间复杂度

    • 使用 Counter 需要存储价格和对应的计数,其空间复杂度为 ( O(k) ),其中 ( k ) 是价格的种类数。

5. 边界条件分析

  • 空列表:如果价格列表为空,直接返回 0,因为没有菜可以点。
  • 所有菜价格均超过 m:若所有菜价格都不符合条件,则过滤后无有效结果,应返回 0
  • 所有菜价格相同:如果价格列表中所有价格都一样,并且价格小于或等于 m,结果就是价格列表的长度。
  • 价格列表中存在多个符合条件的最大值:程序逻辑能够正确返回其中一个最大计数值。

6. 代码实现

以下是完整的代码实现:

from collections import Counter

def solution(m: int, w: list) -> int:
    # 统计每个价格出现的次数
    price_count = Counter(w)
    
    # 筛选出价格不超过 m 的菜
    max_count = 0
    for price, count in price_count.items():
        if price <= m:
            max_count = max(max_count, count)  # 更新最大计数值

    return max_count

# 测试样例
if __name__ == '__main__':
    print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3)  # 样例1
    print(solution(4, [1, 2, 4, 4, 4]) == 3)  # 样例2
    print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4)  # 样例3
    print(solution(10, []) == 0)  # 边界测试1:空列表
    print(solution(2, [3, 4, 5]) == 0)  # 边界测试2:所有菜价格超过 m

7. 样例详解

样例1:

输入:m = 6, w = [2, 3, 3, 6, 6, 6, 9, 9, 23]
处理过程:

  1. 使用 Counter 统计:{6: 3, 3: 2, 9: 2, 2: 1, 23: 1}
  2. 筛选价格不超过 6{6: 3, 3: 2, 2: 1}
  3. 最大值为 3

输出:3

样例2:

输入:m = 4, w = [1, 2, 4, 4, 4]
处理过程:

  1. 使用 Counter 统计:{4: 3, 1: 1, 2: 1}
  2. 筛选价格不超过 4{4: 3, 1: 1, 2: 1}
  3. 最大值为 3

输出:3


总结

本题通过统计和筛选的方法,高效解决了带约束的最大值查找问题。通过合理设计数据结构和算法流程,我们确保了代码的时间和空间复杂度尽可能低,同时全面覆盖了各种边界情况,是一个典型的计数和过滤问题的良好案例。