伴学笔记 | 豆包MarsCode AI刷题

56 阅读3分钟

小C点菜问题 为了解决这个问题,我们需要找到最大数量的价格相同且不超过给定上限 m 的菜品。具体来说,解决思路可以分为以下几个步骤:

解决思路

1.筛选价格不超过 m 的菜品:首先,我们需要筛选出价格不超过 m 的菜品,因为小C不能点单价超过 m 的菜。

2.统计每个价格的菜品数量:对于每个菜品价格,统计其出现的次数。

3.找到出现最多次数的价格:我们从价格不超过 m 的菜品中,找到出现次数最多的价格,返回这个价格对应的菜品数量。

代码实现

from collections import Counter

def solution(m: int, w: list) -> int:

    # 1. 筛选出价格不超过 m 的菜

    valid_prices = [price for price in w if price <= m]

 

    # 2. 如果没有符合条件的菜,直接返回 0

    if not valid_prices:

        return 0

 

    # 3. 统计各个价格出现的次数

    price_count = Counter(valid_prices)

 

    # 4. 找到出现次数最多的价格

    return max(price_count.values())

 

if name == 'main':

    print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]) == 3)  # 输出 3

    print(solution(4, [1, 2, 4, 4, 4]) == 3)               # 输出 3

    print(solution(5, [5, 5, 5, 5, 6, 7, 8]) == 4)         # 输出 4

代码解析

4.筛选价格不超过 m 的菜品:我们使用列表推导式来筛选出所有价格小于或等于 m 的菜品。比如在 w = [2, 3, 3, 6, 6, 6, 9, 9, 23] 中,如果 m = 6,我们筛选出的菜品是 [2, 3, 3, 6, 6, 6]。

5.统计价格的频次:使用 Python 的 collections.Counter 来统计价格出现的次数,它会返回一个字典,其中键是菜品的价格,值是该价格菜品的数量。例如,在 valid_prices = [2, 3, 3, 6, 6, 6] 中,Counter(valid_prices) 会返回 {3: 2, 6: 3, 2: 1}。

6.找到最大频次:我们通过 max(price_count.values()) 来获取出现次数最多的价格的数量。

7.返回结果:返回最常见价格的菜品数量。

  复杂度分析  

8.时间复杂度:我们首先筛选菜品,时间复杂度是 O(n),其中 n 是菜品的数量。接着使用 Counter 统计频次,时间复杂度也是 O(n)。因此,总时间复杂度为 O(n)。

9.空间复杂度:存储筛选出的有效菜品和频次统计的字典,空间复杂度是 O(n)。

测试用例

print(solution(6, [2, 3, 3, 6, 6, 6, 9, 9, 23]))  # 输出 3

print(solution(4, [1, 2, 4, 4, 4]))               # 输出 3

print(solution(5, [5, 5, 5, 5, 6, 7, 8]))         # 输出 4

 

解释

10.在示例 1 中,m = 6,菜品的价格为 [2, 3, 3, 6, 6, 6, 9, 9, 23]。符合条件的菜品是 [2, 3, 3, 6, 6, 6],其中价格 6 出现最多(出现 3 次),所以答案是 3。

11.在示例 2 中,m = 4,菜品的价格为 [1, 2, 4, 4, 4]。符合条件的菜品是 [1, 2, 4, 4, 4],其中价格 4 出现最多(出现 3 次),所以答案是 3。

12.在示例 3 中,m = 5,菜品的价格为 [5, 5, 5, 5, 6, 7, 8]。符合条件的菜品是 [5, 5, 5, 5],价格 5 出现最多(出现 4 次),所以答案是 4。