青训营刷题日记3| 豆包MarsCode AI刷题

37 阅读3分钟

小C点菜问题

问题描述

小C来到了一家餐馆,准备点一些菜。

已知该餐馆有 n道菜,第 i道菜的售价为 wi​。

小C准备点一些价格相同的菜,但小C不会点单价超过 m 的菜。

小C想知道,自己最多可以点多少道菜?

测试样例

样例1:

  • 输入:m=6,w=[2,3,3,6,6,6,9,9,23]m=6,w=[2,3,3,6,6,6,9,9,23]
  • 输出:3

样例2:

  • 输入:m=4,w=[1,2,4,4,4]m=4,w=[1,2,4,4,4]
  • 输出:3

样例3:

  • 输入:m=5,w=[5,5,5,5,6,7,8]m=5,w=[5,5,5,5,6,7,8]
  • 输出:4

解决方案

为了解决这个问题,我们可以按照以下步骤进行:

  1. 过滤出价格不超过 m 的菜肴:首先,我们需要遍历所有菜肴的价格,并筛选出那些价格不超过 mm 的菜肴。
  2. 统计每种价格的数量:使用一个计数器来统计每种价格的菜肴数量。
  3. 返回数量最多的价格的数量:最后,我们找出数量最多的价格,并返回其对应的数量。

下面是具体的Python代码实现:

from collections import Counter

def solution(m: int, w: list) -> int:
    # 过滤出价格不超过 m 的菜肴
    filtered_prices = [price for price in w if price <= m]
    
    # 统计每种价格的数量
    price_count = Counter(filtered_prices)
    
    # 返回数量最多的价格的数量
    return max(price_count.values(), default=0)  # default=0 处理空列表的情况

if __name__ == '__main__':
    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)
   

个人思考与分析

在这个问题中,我们主要使用了Python中的列表推导式和collections.Counter类。列表推导式用于过滤符合条件的元素,而Counter类则用于统计元素的出现次数。这种方法简洁且高效,能够快速地解决问题。

时间复杂度分析

  1. 过滤操作:需要遍历整个列表,时间复杂度为 O(n)O(n)。
  2. 计数操作:使用Counter类对过滤后的列表进行计数,时间复杂度也是 O(n)O(n)。
  3. 查找最大值:在计数结果中找到最大值,时间复杂度为 O(k)O(k),其中 k 是不同价格的数量。在最坏情况下,k≤nk≤n。

因此,总的时间复杂度为 O(n)O(n)。

空间复杂度分析

  1. 过滤后的列表:需要额外的空间存储过滤后的结果,空间复杂度为 O(n)O(n)。
  2. 计数器:需要额外的空间存储每个价格的计数,空间复杂度为 O(k)O(k)。

因此,总的空间复杂度为 O(n+k)O(n+k)。在最坏情况下,k≤nk≤n,所以空间复杂度可以简化为 O(n)O(n)。

总结

通过上述分析和代码实现,我们成功地解决了小C点菜的问题。这个题目不仅考察了基本的列表操作和计数技巧,还涉及到了算法的时间和空间复杂度分析。希望这篇笔记能够帮助大家更好地理解和解决类似的问题。