小C点菜问题 常用库的运用 | 豆包MarsCode AI 刷题

55 阅读3分钟

问题描述

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

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

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

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


测试样例

样例1:

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

样例2:

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

样例3:

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

问题理解

这道题需要求出售价低于特定值的数出现次数的最大值,那么我们通过一次遍历,在遍历时记录当前售价出现的次数,并不断更新最大出现次数,就可以得到答案。 基本的方法已知了,那么,有什么简便写法呢?

别样的尝试

我们知道,在python中存在着字典这一数据结构,存放了相应的键值对,并且对于字典,有一个Counter子类专门用于计数,既然我们已经有了如此方便的东西,便可以直接使用Counter,省去了前面冗余的计算每个出现次数的过程,然后直接遍历Counter,得到符合条件的数量的最大值就可以了

解题思路

  1. 统计价格出现次数

    • 使用 Counter(w) 统计列表 w 中每个价格出现的次数。
  2. 遍历统计结果

    • 遍历 Counter 对象中的键值对,其中 k 是价格,v 是该价格出现的次数。
  3. 筛选符合条件的价格

    • 对于每个价格 k,检查它是否不超过上限 m
  4. 更新最大数量

    • 如果价格 k 不超过上限 m,则更新最大数量 ans,使其等于当前最大数量和该价格出现次数 v 中的较大值。
  • 时间复杂度:O(n)
  • 空间复杂度:O(n)

其中 n 是列表 w 的长度。

题目总结

在这个题目中,我们需要计算小C在餐馆中最多可以点多少道价格相同的菜,且这些菜的价格不能超过给定的上限 m。为了高效地解决这个问题,我们使用了 collections 模块中的 Counter 类来简化统计过程。

数据结构选择

Counter 是一个非常有用的工具,它能够自动统计列表中每个元素的出现次数。在这个问题中,我们使用 Counter 来统计每种价格出现的次数。这样,我们就可以通过遍历 Counter 对象中的键值对,快速找到符合条件的价格,并计算出最多可以点的菜的数量。

通过使用 Counter,我们能够高效地统计每种价格出现的次数,并快速找到符合条件的价格。这种方法不仅简化了代码,还提高了算法的效率。最终,我们能够在 O(n) 的时间复杂度和 O(n) 的空间复杂度内解决这个问题。