超市商品销售优化题解 | 豆包MarsCode AI 刷题

51 阅读3分钟

题解

在这个问题中,我们需要通过重新调整货架上的商品顺序,以便尽可能多地满足顾客的需求。顾客按照顺序寻找商品,如果遇到空格子或找完所有商品后还未找到想要的商品,就会停止。因此,我们的任务是尽可能多地出售商品,换句话说,就是最大化满足顾客需求。

思路分析

我们可以分为以下几个步骤来解决这个问题:

  1. 统计货架商品的数量:我们首先需要了解货架上每种商品的数量,使用 Counter 来记录货架上每个商品的数量。
  2. 统计顾客需求商品的数量:然后,我们统计每个顾客想要购买的商品的数量,使用 Counter 来记录顾客的需求。
  3. 计算最优售卖数量:为了最大化售卖的商品数量,我们可以按顾客的需求顺序遍历每种商品,并与货架上的商品进行匹配。由于顾客会依次寻找商品,任何一件商品只要在货架上有库存,并且顾客有需求,就可以卖出。因此,能卖出的数量就是货架上该商品的数量和顾客需求数量中的较小值。
  4. 总结:每种商品我们都尽量满足顾客需求,最终加总所有商品的销售数量即为最大销售数量。

代码实现

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

解析

  1. 输入分析

    1. n:货架的格子数,这个参数在计算时并不直接使用,因为我们只关心每个商品的数量。
    2. m:顾客想要购买的商品种类数,这个参数也仅作为参考,实际计算依赖于 c 字符串。
    3. s:货架上商品的初始顺序,我们可以通过 Counter(s) 统计货架上每种商品的数量。
    4. c:顾客想要购买的商品种类,我们通过 Counter(c) 统计顾客的需求。
  2. 核心逻辑

    1. 我们通过 Counter 来统计 sc 中商品的数量。
    2. 对于每种商品,检查货架上是否有该商品,并计算能卖出的数量,能够卖出的数量为 min(顾客需求数量, 货架商品数量)
    3. 累加所有商品的销售数量,即为最终的最大销售数量。
  3. 时间复杂度

    • 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。

总结

该算法通过统计货架商品和顾客需求的数量,利用最小值策略来计算最大可销售商品数,思路清晰,代码简洁,效率较高,适用于处理类似的商品分配问题。