[No.154]小C点菜问题 | 豆包MarsCode AI刷题

48 阅读3分钟

题目描述

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

已知该餐馆有 nn 道菜,第 ii 道菜的售价为 wiwi​。

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

小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

数据结构选择

  1. 过滤价格:我们需要过滤掉所有价格超过 m 的菜品。可以使用一个数组来存储过滤后的价格。
  2. 统计数量:为了统计每个价格的菜品数量,我们可以使用一个哈希表(unordered_map),其中键是价格,值是该价格的菜品数量。
  3. 找出最大值:我们需要遍历哈希表,找出数量最多的那个价格对应的菜品数量。

算法步骤

  1. 过滤价格

    • 遍历输入的菜品价格数组 w
    • 对于每个价格 price,如果 price <= m,则将其加入到一个新的数组 filtered 中。
  2. 统计数量

    • 遍历 filtered 数组。
    • 使用一个 unordered_map<int, int> 来统计每个价格的菜品数量。对于每个价格 price,将其对应的值加一。
  3. 找出最大值

    • 遍历 unordered_map,找出值最大的那个键值对。
    • 记录最大值 maxCount,并返回该值。

详细步骤分析

  1. 过滤价格

    • 这一步的目的是去除所有价格超过 m 的菜品,因为小C不会点这些菜。
    • 通过遍历 w 数组,我们可以快速过滤出符合条件的菜品价格。
    • 使用一个数组 filtered 来存储过滤后的价格,这样可以方便后续的统计操作。
  2. 统计数量

    • 这一步的目的是统计每个价格的菜品数量。
    • 使用 unordered_map 可以高效地进行统计,因为哈希表的查找和插入操作的时间复杂度都是 O(1)。
    • 对于每个价格 price,我们将其对应的值加一,表示该价格的菜品数量增加了一个。
  3. 找出最大值

    • 这一步的目的是找出数量最多的那个价格对应的菜品数量。
    • 遍历 unordered_map,我们可以找到值最大的那个键值对。
    • 使用一个变量 maxCount 来记录最大的菜品数量,并在遍历过程中不断更新。

解题代码

#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;

long solution(int m, const std::vector<int> w) {
    // Step 1: Filter prices
    std::vector<int> filtered;
    for (int price : w) {
        if (price <= m) {
            filtered.push_back(price);
        }
    }
    
    // Step 2: Count occurrences of each price
    std::unordered_map<int, int> priceCount;
    for (int price : filtered) {
        priceCount[price]++;
    }
    
    // Step 3: Find the maximum count
    int maxCount = 0;
    for (const auto& pair : priceCount) {
        if (pair.second > maxCount) {
            maxCount = pair.second;
        }
    }
    
    return maxCount;
}

int main() {
    std::cout << (solution(6, {2, 3, 3, 6, 6, 6, 9, 9, 23}) == 3) << std::endl;
    std::cout << (solution(4, {1, 2, 4, 4, 4}) == 3) << std::endl;
    std::cout << (solution(5, {5, 5, 5, 5, 6, 7, 8}) == 4) << std::endl;
    return 0;
}

题目总结

通过以上步骤,我们可以有效地解决这个问题。首先过滤掉不符合条件的菜品价格,然后统计每个价格的菜品数量,最后找出数量最多的那个价格对应的菜品数量。这个算法的时间复杂度为 O(n),其中 n 是菜品数量,因为我们需要遍历菜品价格数组两次(一次过滤,一次统计),并且遍历哈希表一次。空间复杂度为 O(n),因为我们使用了两个额外的数据结构(filtered 数组和 unordered_map