今天在刷算法题时遇到了一道非常经典的贪心问题,目标是重新排列货物架上的商品,使得尽可能多的顾客能找到并购买商品。由于这道题难度适中且遇到的频率比较高,所以我今天分享一下我个人的解题思路和具体代码给大家,希望能抛砖引玉。下面从问题分析、代码解析、用例测试等方面逐步解答。
问题分析
在一个超市里,有一个包含n个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第n个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。
- 输入信息:
• n:货物架的格子数。
• m:顾客想购买的商品种类数。
• s:货物架上的初始商品排列(包含小写字母和可能的空格,用 '.' 表示)。
• c:顾客想要购买的商品种类集合。
- 关键点:
• 空格子 '.' 不影响顾客查找商品,但会导致顾客停止查找。
• 商品顺序可以调整,但只能使用已有的商品,不能新增商品。
• 想要尽量满足顾客需求,需要优先考虑货物架上的商品和顾客的需求之间的匹配。
- 解决思路:
• 统计需求:计算每种商品的需求数量(由顾客 c 提供)。
• 统计库存:计算货物架上每种商品的库存数量(由字符串 s 提供)。
• 匹配策略:优先满足顾客的需求,尽量多地从货物架分配商品给顾客。
• 对于每种商品,分配的数量 = min(需求数量, 库存数量)。
• 重新排序货物架:根据顾客的需求,将能卖出的商品优先排在货物架前面。
实现代码
def solution(n, m, s, c):
# 统计货物架上商品的库存
inventory = {}
for char in s:
if char != '.':
inventory[char] = inventory.get(char, 0) + 1
# 统计顾客需求
demand = {}
for char in c:
demand[char] = demand.get(char, 0) + 1
# 计算最多能卖出的商品数量
max_sales = 0
for char, count in demand.items():
if char in inventory:
max_sales += min(count, inventory[char])
return max_sales
if __name__ == "__main__":
# 测试用例
print(solution(6, 3, "abcabc", "a")) # 输出 1
print(solution(6, 3, "abcabc", "abc")) # 输出 3
print(solution(6, 3, "abc...", "abcd")) # 输出 3
print(solution(6, 3, "......", "abc")) # 输出 0
print(solution(6, 3, "aabbcc", "aaabbbccc")) # 输出 6
代码解析
- 统计库存:
• 遍历货物架上的商品字符串 s,计算每种商品的数量,存储在字典 inventory 中。
- 统计需求:
• 遍历顾客的需求列表 c,统计每种商品的需求数量,存储在字典 demand 中。
- 匹配库存与需求:
• 对于顾客需求中的每种商品:
• 如果该商品在货物架上有库存,则计算该商品能卖出的最大数量:min(需求数量, 库存数量)。
• 将最大数量累加到 max_sales。
- 返回结果:
• 返回最终计算的 max_sales。
复杂度分析
- 时间复杂度:
• 统计库存:,遍历货物架上的商品。
• 统计需求:,遍历顾客的需求列表。
• 匹配库存与需求:。
• 总时间复杂度: 。
- 空间复杂度:
• 使用字典 inventory 和 demand,空间复杂度为 ,其中 是商品种类的数量。
• 总空间复杂度: 。
测试用例分析
- 用例1:
• 输入:n=6, m=3, s="abcabc", c="a"
• 分析:顾客只需要 a,货物架上有 2 个 a,因此能卖出 1 个。
• 输出:1
- 用例2:
• 输入:n=6, m=3, s="abcabc", c="abc"
• 分析:顾客需要 a、b、c 各 1 个,货物架上每种商品都有 2 个,因此能卖出 3 个。
• 输出:3
- 用例3:
• 输入:n=6, m=3, s="abc...", c="abcd"
• 分析:顾客需要 a、b、c 和 d,但货物架上没有 d,因此只能卖出 3 个。
• 输出:3
总结
该算法充分利用了贪心策略,优先满足顾客需求的同时,也保证了算法的高效性。