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

48 阅读5分钟

问题描述

小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

思路介绍

小C在餐馆点菜,餐馆有 n 道菜,每道菜的价格为 w_i。小C只会点价格不超过 m 的菜,并且希望点尽可能多的价格相同的菜。我们需要找出小C最多可以点多少道价格相同的菜。 首先过滤掉不符合条件的菜品,然后统计每个价格的菜品数量,最后找出数量最多的那个价格对应的菜品数量。这个方法的时间复杂度为 O(n),其中 n 是菜品数量,因为我们只需要遍历菜品数组和哈希表各一次。

算法步骤

  1. 过滤价格

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

    • 遍历 filtered_prices 数组,使用一个 unordered_map<int, int> 来记录每个价格的菜品数量。对于每个价格 price,执行 price_count[price]++
  3. 找出最大值

    • 遍历 price_count 哈希表,找出数量最多的那个价格对应的菜品数量。使用一个变量 max_count 来记录最大数量,初始值为 0。对于每个键值对 pair,如果 pair.second > max_count,则更新 max_count

答案

#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_prices;
    for (int price : w) {
        if (price <= m) {
            filtered_prices.push_back(price);
        }
    }

    // Step 2: Count occurrences of each price
    std::unordered_map<int, int> price_count;
    for (int price : filtered_prices) {
        price_count[price]++;
    }

    // Step 3: Find the maximum count
    int max_count = 0;
    for (const auto& pair : price_count) {
        if (pair.second > max_count) {
            max_count = pair.second;
        }
    }

    return max_count;
}

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;
}

利用MarsCode AI 刷题学习的总结

在学习编程和算法时,刷题是非常重要的一环,它不仅能帮助我们巩固所学知识,还能提高我们的思维能力和解决问题的技巧。如今,借助像 MarsCode AI 这样的智能平台,可以让刷题的学习过程更加高效和有趣。MarsCode AI 通过分析题目和提供个性化的解题思路,使得学习变得更具系统性和针对性。在这篇文章中,我将分享我如何利用 MarsCode AI 进行刷题学习,并总结这一过程带给我的收获和体会。

1. 题目理解与分析

每道题目开始时,我都会仔细分析题目的要求和给定的数据。就像上面的例题一样,我们首先需要理解题目所描述的场景。题目让我们计算最多可以点多少道价格相同的菜,但限定了单价不能超过给定的最大值 m。通过分析,我知道这实际上是在进行数组过滤和元素频次统计的操作。因此,首先要过滤出价格小于等于 m 的菜品,然后统计这些菜品中每个价格出现的次数,最后求出出现最多的价格。

2. 算法设计与实现

在分析完题目后,下一步就是设计解决问题的算法。在这个问题中,利用哈希表来统计价格出现的次数是非常直观的做法。我们可以遍历菜品价格数组,使用哈希表记录每个菜品价格的出现次数。之后,只需要找到出现次数最多的那个价格即可。具体而言,我实现了三个步骤:

  • 过滤价格:遍历数组,筛选出所有小于等于 m 的菜品价格。
  • 统计频次:使用哈希表统计每个价格出现的次数。
  • 找出最大值:遍历哈希表,找出出现次数最多的价格。

整个过程的时间复杂度是 O(n),其中 n 是菜品的数量。

3. MarsCode AI 的帮助

使用 MarsCode AI 的最大优势是可以在解题过程中获得智能化的反馈和建议。在遇到不确定的地方时,我可以向平台寻求帮助,平台不仅会为我提供解题的思路,还会针对我的解法提出优化建议。例如,MarsCode AI 可以帮助我从不同的角度思考问题,指出是否可以用更高效的数据结构或算法来解决问题。此外,平台还会根据我的学习进度推荐相关的题目进行练习,这使得我的学习更加系统化。

4. 提高编程思维与效率

通过在 MarsCode AI 上刷题,我能够更清晰地梳理出解题的步骤和逻辑,并且通过反复练习加深对算法的理解。例如,通过这道题目,我学会了如何快速用哈希表统计元素频次,并应用这些知识解决类似问题。平台不仅帮助我提升了编码能力,还提高了我解决实际问题的思维敏捷性。

5. 总结

总的来说,利用 MarsCode AI 刷题是一种高效且愉快的学习方式。它帮助我在学习中保持了高度的专注和热情,同时通过实时反馈和智能建议,使我的编程能力得到了显著提高。我相信,在持续刷题和优化解法的过程中,我的算法思维和编程技能将进一步得到提升,最终能够在实际项目中游刃有余地应用这些技能。