题解
在这个问题中,我们需要通过重新调整货架上的商品顺序,以便尽可能多地满足顾客的需求。顾客按照顺序寻找商品,如果遇到空格子或找完所有商品后还未找到想要的商品,就会停止。因此,我们的任务是尽可能多地出售商品,换句话说,就是最大化满足顾客需求。
思路分析
我们可以分为以下几个步骤来解决这个问题:
- 统计货架商品的数量:我们首先需要了解货架上每种商品的数量,使用
Counter来记录货架上每个商品的数量。 - 统计顾客需求商品的数量:然后,我们统计每个顾客想要购买的商品的数量,使用
Counter来记录顾客的需求。 - 计算最优售卖数量:为了最大化售卖的商品数量,我们可以按顾客的需求顺序遍历每种商品,并与货架上的商品进行匹配。由于顾客会依次寻找商品,任何一件商品只要在货架上有库存,并且顾客有需求,就可以卖出。因此,能卖出的数量就是货架上该商品的数量和顾客需求数量中的较小值。
- 总结:每种商品我们都尽量满足顾客需求,最终加总所有商品的销售数量即为最大销售数量。
代码实现
python
复制代码
from collections import Counter
def solution(n: int, m: int, s: str, c: str) -> int:
# 统计货架上每种商品的数量
shelf_count = Counter(s)
# 统计顾客想要购买的商品数量
customer_count = Counter(c)
max_sold = 0
# 计算最多能销售的商品数量
for item in customer_count:
if item in shelf_count:
# 能够卖出的数量是货架上该商品的数量与顾客需求的最小值
max_sold += min(customer_count[item], shelf_count[item])
return max_sold
# 测试用例
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3) # 输出 3
print(solution(4, 2, "abbc", "bb") == 2) # 输出 2
print(solution(5, 4, "bcdea", "abcd") == 4) # 输出 4
解析
-
输入分析:
n:货架的格子数,这个参数在计算时并不直接使用,因为我们只关心每个商品的数量。m:顾客想要购买的商品种类数,这个参数也仅作为参考,实际计算依赖于c字符串。s:货架上商品的初始顺序,我们可以通过Counter(s)统计货架上每种商品的数量。c:顾客想要购买的商品种类,我们通过Counter(c)统计顾客的需求。
-
核心逻辑:
- 我们通过
Counter来统计s和c中商品的数量。 - 对于每种商品,检查货架上是否有该商品,并计算能卖出的数量,能够卖出的数量为
min(顾客需求数量, 货架商品数量)。 - 累加所有商品的销售数量,即为最终的最大销售数量。
- 我们通过
-
时间复杂度:
Counter(s)和Counter(c)的时间复杂度是O(n + m),其中n是货架商品的数量,m是顾客需求商品的数量。- 遍历顾客需求商品时,时间复杂度是
O(m),总的时间复杂度是O(n + m)。
测试
-
测试样例1: 输入:
n = 3, m = 4, s = "abc", c = "abcd"- 货架上商品数量:
a: 1, b: 1, c: 1 - 顾客需求商品数量:
a: 1, b: 1, c: 1, d: 1 - 最终能卖出的商品:
a: 1, b: 1, c: 1,共3个商品,因此输出 3。
- 货架上商品数量:
总结
该算法通过统计货架商品和顾客需求的数量,利用最小值策略来计算最大可销售商品数,思路清晰,代码简洁,效率较高,适用于处理类似的商品分配问题。