9.超市里的货物架调整 | 豆包MarsCode AI刷题

1 阅读3分钟

在这道题目中,我们需要调整货物架上的商品顺序,以便在顾客到来之后,最大限度地满足他们的需求,从而出售更多商品。这是一个经典的贪心算法应用场景,题目中给出的输入包括货物架的初始商品序列和顾客想要购买的商品列表。

问题分析

  • 输入数据

    • n:货物架的格子数。
    • m:顾客想要购买的商品种类数。
    • s:货物架上的初始商品顺序,由长度为 n 的字符串表示。
    • c:顾客想要购买的商品种类,由长度为 m 的字符串表示。
  • 输出数据

    • 一个整数,表示在最优调整下最多可以卖出的商品数量。

目标:通过重新排列 s 中的商品,使得顾客在寻找商品时能尽可能多地满足需求。

样例分析

  • 样例1

    • 输入:n = 3, m = 4, s = "abc", c = "abcd"
    • 分析:货物架上有商品 abc,顾客想购买 abcd。将 s 调整为 "abc"(无需调整),可以售出 3 件商品。
    • 输出:3
  • 样例2

    • 输入:n = 4, m = 2, s = "abbc", c = "bb"
    • 分析:货物架上有 a,两个 b,和 c,顾客只需要 b。调整后可以将货物架调整为 "bbac",售出 2 件商品。
    • 输出:2
  • 样例3

    • 输入:n = 5, m = 4, s = "bcdea", c = "abcd"
    • 分析:顾客想购买的商品为 abcd,而货物架上有 bcdea。通过调整可以将货物架变为 "bcda",可以售出 4 件商品。
    • 输出:4

解题思路

我们可以通过以下步骤来解决问题:

  1. 统计需求频次:首先统计顾客需要的商品数量。
  2. 统计库存:统计货物架上每种商品的数量。
  3. 匹配需求与库存:将顾客的需求和货物架上的商品匹配,尽量满足顾客需求。
  4. 贪心策略:为了最大化售出商品的数量,优先匹配顾客需求量较大的商品。

代码详解

以下是实现这一逻辑的Python代码:

from collections import Counter
def solution(n: int, m: int, s: str, c: str) -> int:
    # 统计货架上每种商品的数量
    stock_count = Counter(s)

    # 统计顾客需求的商品种类及数量
    demand_count = Counter(c)
    
    total_sold = 0

    # 遍历顾客需求的每种商品

    for product, demand in demand_count.items():
        if product in stock_count:
        # 计算能出售的商品数量
        total_sold += min(stock_count[product], demand)
        
    return total_sold
    
if __name__ == '__main__':
print(solution(3, 4, "abc", "abcd") == 3)
print(solution(4, 2, "abbc", "bb") == 2)
print(solution(5, 4, "bcdea", "abcd") == 4)

代码解析

  1. Counter统计: 使用 collections.Counter 分别统计货物架和顾客需求的商品数量。

  2. 需求匹配: 遍历顾客需求,通过 min(demand, stock) 的方式,计算每种商品的最大售出量。

  3. 库存更新: 在满足某种商品的需求后,减少货物架中该商品的库存数量,避免重复计算。

  4. 结果累加: 将每种商品售出的数量累加,得到最终结果。

性能分析

  • 时间复杂度

    • 统计商品数量的时间复杂度为 O(n + m)
    • 匹配需求与库存的复杂度为 O(m)
    • 总体时间复杂度为 O(n + m)
  • 空间复杂度

    • 使用了两个 Counter 数据结构,空间复杂度为 O(n + m)

思考

本题目展示了贪心算法在资源分配问题中的应用,通过统计和匹配的方式,我们可以高效地计算出最大售出商品的数量。