在编程学习的过程中,刷题是提高算法与编程能力的一项重要方法。特别是对于想深入掌握数据结构与算法的同学,刷题不仅能够加深对基础知识点的理解,还能够帮助我们提高问题分析与解决能力。最近,我通过使用豆包MarsCode AI刷题平台进行练习,完成了一个关于超市商品排列问题的题目,这篇文章将结合我的解题过程,分享一些学习方法与心得。
题目概述
题目描述了一个包含 n 个格子的货物架,每个格子内有一种商品,商品用字母 a 到 z 表示。顾客进入超市时会依次查找每个格子,寻找他们想要的商品。如果顾客在某个格子中找到了商品,他们便购买该商品并离开;如果途中遇到空格子或查找完所有格子仍未找到商品,顾客也会离开。作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,使得尽可能多的商品能够售出。
问题的核心是如何优化商品的排列顺序,以便在顾客查找时最大化卖出商品的数量。具体来说,给定货架上商品的初始顺序和顾客的购买需求,你需要计算在最优调整下,最多可以卖出多少件商品。
题目解析
-
输入与输出:
- 输入:有
n个格子的货物架,m种顾客的购买需求,货架商品的初始顺序字符串s和顾客的购买商品类型字符串c。 - 输出:最优调整后的情况下,最多能够卖出的商品数。
- 输入:有
-
解题思路:
- 本题的关键在于“重新调整商品的顺序”。要使得顾客尽可能多地买到商品,可以通过计算顾客需求与货架商品的匹配情况来优化商品的排列顺序。
- 具体的思路是:统计货架上每个商品的数量,并统计顾客需求中每种商品的数量。然后,对于每种商品,卖出的数量等于该商品在货架上的数量和顾客需求中该商品数量的最小值。
-
关键操作:
- 使用
map来记录货架上每种商品的数量(ps)和顾客需求中每种商品的数量(pc)。 - 对于每个商品,计算
min(ps[k], pc[k]),即该商品在货架上的数量和顾客需求中该商品的数量的最小值,然后累加这些最小值,得到最终的卖出商品数量。
- 使用
代码详解
#include <bits/stdc++.h>
using namespace std;
int solution(int n, int m, string s, string c) {
map<char , int> ps , pc;
// 统计货架上每种商品的数量
for(auto it : s)
ps[it]++;
// 统计顾客需要购买的每种商品的数量
for(auto it : c)
pc[it]++;
int cnt = 0;
// 计算每种商品的最小匹配数量,并累加
for(auto [k , v] : pc)
cnt += min(ps[k] , v);
return cnt;
}
int main() {
// 测试案例
cout << (solution(3, 4, "abc", "abcd") == 3) << endl; // 期望输出3
cout << (solution(4, 2, "abbc", "bb") == 2) << endl; // 期望输出2
cout << (solution(5, 4, "bcdea", "abcd") == 4) << endl; // 期望输出4
return 0;
}
代码分析
-
数据结构选择:我们使用了
map来存储商品的数量,因为map可以按键(商品类型)自动排序并快速查找。ps用于记录货架上每种商品的数量,pc用于记录顾客需求中每种商品的数量。 -
循环操作:
- 第一部分:遍历货架商品字符串
s,统计每种商品的数量,并存入ps中。 - 第二部分:遍历顾客需求字符串
c,统计每种商品的需求数量,并存入pc中。 - 第三部分:通过遍历
pc中的每个商品,计算该商品在货架上能卖出的数量。这个数量是货架上该商品的数量ps[k]和顾客需求中该商品的数量pc[k]的最小值,然后将这些最小值累加起来得到最终的卖出商品数量。
- 第一部分:遍历货架商品字符串
-
时间复杂度:
- 统计货架商品和顾客需求的时间复杂度分别为
O(n)和O(m),其中n是货架上的商品数,m是顾客的需求商品数。 - 遍历并计算最小值的时间复杂度为
O(m),因此整体时间复杂度为O(n + m)。
- 统计货架商品和顾客需求的时间复杂度分别为
知识总结
通过这道题,我总结了以下几点知识和思考:
- 哈希表的应用:
map或者unordered_map在这类题目中非常有用,它们能够帮助我们高效地统计数据和进行匹配操作。 - 贪心思想:题目可以看作是一个典型的贪心问题,我们通过每次选择当前能够售出的商品最大数量,来达到最优解。
- 边界情况的处理:需要特别注意商品的数量可能不足以满足所有顾客的需求,因此用
min函数来避免数量超出实际情况。
学习方法与建议
-
制定刷题计划:对于初学者,我建议按照难度从低到高进行逐步练习,确保理解每一个数据结构与算法的基本原理。豆包MarsCode AI刷题平台提供了丰富的题库,可以根据自己的进度制定合理的刷题计划。
-
错题总结:每次遇到错题时,不仅要分析代码逻辑是否正确,还要思考题目的思路是否正确。错题是提升自己最好的机会。可以使用豆包MarsCode AI的错题回顾功能,针对性地提升。
-
结合其他资源:除了使用AI刷题平台外,还可以参考一些经典的算法书籍(如《算法导论》)以及线上课程,提升自己的理论知识水平。
结语
通过不断刷题和总结,我深刻体会到解题过程中的思维训练与方法总结对于编程能力的提高至关重要。希望通过这篇笔记的分享,能够帮助更多的同学在刷题过程中获得灵感,提高自己的算法水平。同时,保持持续学习和实践,将会在编程的道路上走得更远。