题目解析:超市商品售卖问题
题目描述
本题旨在解决一个关于商品排列优化的问题。我们需要根据顾客的需求调整商品的顺序,以最大化售卖数量。问题的难点在于如何在有限的空间和商品资源下,满足尽可能多的顾客需求。这涉及到资源分配和优先级匹配的经典问题。通过本题,我们可以深入理解贪心算法的思想及其在实际问题中的应用。
解题思路
1. 问题建模
货物架是一个可以存储 n 个商品的数组,每个位置存储一种商品。顾客会从左到右依次查找需求,如果找到商品,立即购买并离开;如果遇到空格子或未找到商品,直接离开。
目标是调整商品顺序,使得可以满足尽可能多的顾客需求。调整的关键在于:
- 顾客需求优先级:优先排列顾客需要的商品。
- 库存限制:商品售卖需要考虑库存,售出一个商品后库存相应减少。
2. 算法设计
通过以下步骤解决问题:
- 统计库存:使用一个字典统计货架上每种商品的数量。
- 遍历顾客需求:对于顾客的需求列表,逐一匹配字典中的商品库存,找到一个售出一个,并减少库存。
- 计数售出商品:统计成功售出的商品总数,作为输出结果。
3. 贪心策略
由于顾客是按照顺序查找需求,因此我们只需贪心地满足当前需求,售出尽可能多的商品即可,不需要额外复杂的调整或规划。
代码详解
def solution(n: int, m: int, s: str, c: str) -> int:
# 统计货架上的商品数量
shelf_count = {}
for item in s:
shelf_count[item] = shelf_count.get(item, 0) + 1
# 计算最多能售出的商品数量
sold_items = 0
for item in c:
if item in shelf_count and shelf_count[item] > 0:
sold_items += 1
shelf_count[item] -= 1 # 售出一个该商品
return sold_items
# 测试用例
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd")) # 输出 3
print(solution(4, 2, "abbc", "bb")) # 输出 2
print(solution(5, 4, "bcdea", "abcd")) # 输出 4
代码解析
-
统计库存:
使用字典shelf_count存储货架上每种商品的数量。例如,货架s = "abc"会被转化为:shelf_count = {'a': 1, 'b': 1, 'c': 1} -
顾客需求遍历:
遍历顾客需求字符串c,对于每个需求商品:- 如果商品在库存中且库存量大于 0,则售出商品,计数
sold_items加 1,库存减 1; - 如果库存量为 0,则跳过该需求。
- 如果商品在库存中且库存量大于 0,则售出商品,计数
-
时间复杂度:
- 统计库存的复杂度为
O(n),其中n是货物架长度; - 遍历顾客需求的复杂度为
O(m),其中m是顾客需求长度; - 总体复杂度为
O(n + m),适合大规模输入场景。
- 统计库存的复杂度为
知识总结
1. 贪心算法的应用场景
本题的解决方案是一个典型的贪心算法应用场景:通过局部最优解(满足当前需求)达到全局最优解(售出最多商品)。这类问题广泛应用于资源分配和优化问题,如:
- 仓库管理:最大化订单满足率;
- 动态调度:根据实时需求调整资源分布。
2. 字典在计数场景的使用
本题使用字典统计库存,结合 get 方法避免空值判断,提高代码可读性。这种方法在字符串处理、计数问题中非常常见,例如:
- 字符频率统计;
- 单词计数。
3. 输入限制与边界处理
在实际开发中,需要处理一些特殊情况:
- 如果顾客需求
c中包含货架上不存在的商品; - 如果货架为空
s = ""或顾客需求为空c = ""。
学习建议与刷题计划
1. 高效学习方法
- 明确目标:在刷题前明确题目类型(如贪心算法、动态规划),并结合题目难度选择适合自己的题目。
- 分步骤解决问题:复杂问题可以拆解为子问题,例如本题中先统计库存,再匹配需求,最后计数结果。
- 总结通用模板:类似的资源分配问题可以归纳出通用解题模板,例如哈希表统计、贪心策略优化等。
2. 错题复盘与巩固
- 记录错题类型:分析错题是理解题目不清、思路混乱还是代码实现问题;
- 对比多种解法:通过参考优秀解法发现自己的思路局限性,培养灵活的思维方式。
3. 刷题规划
- 每日刷题 3~5 道,重点覆盖不同算法思想;
- 每周对错题进行整理复盘,归纳解决方法。
工具运用建议
在使用豆包MarsCode AI刷题时,可以结合以下工具提升学习效果:
- 代码调试:借助代码运行功能,快速验证逻辑是否正确,尤其适合边界测试和大规模输入场景。
- 题目分类:通过题库的分类功能,按主题刷题,有助于形成体系化的知识结构。
- 学习资源结合:结合豆包提供的解析与在线资料(如LeetCode或算法书籍),深入理解题目背景和算法原理。
- 交流分享:将自己的解题思路和总结分享给他人,通过交流加深对问题的理解。
总结
通过这道超市商品售卖问题,可以学习到:
- 如何使用贪心算法解决资源优化问题;
- 字典在统计和匹配问题中的高效应用;
- 刷题中记录错题、总结模板的重要性。
在未来的刷题过程中,我会继续使用豆包MarsCode AI刷题功能,结合错题本和分类题库,制定高效的学习计划,提升算法能力,为更复杂的编程挑战做好准备!