问题描述
小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 是菜品数量,因为我们只需要遍历菜品数组和哈希表各一次。
算法步骤
-
过滤价格:
- 遍历
w数组,对于每个价格price,如果price <= m,则将其加入到一个新的数组filtered_prices中。
- 遍历
-
统计数量:
- 遍历
filtered_prices数组,使用一个unordered_map<int, int>来记录每个价格的菜品数量。对于每个价格price,执行price_count[price]++。
- 遍历
-
找出最大值:
- 遍历
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 刷题是一种高效且愉快的学习方式。它帮助我在学习中保持了高度的专注和热情,同时通过实时反馈和智能建议,使我的编程能力得到了显著提高。我相信,在持续刷题和优化解法的过程中,我的算法思维和编程技能将进一步得到提升,最终能够在实际项目中游刃有余地应用这些技能。