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

67 阅读3分钟

问题分析

在这个问题中,我们需要尽可能多地满足顾客的购买需求,这需要综合考虑商品的初始位置和顾客的需求顺序。以下是对问题的逐步分析:

输入数据解读

  • 货物架上的商品排列

    • 给定的字符串 s 表示货物架上的商品顺序。
    • 每个格子可能包含一种商品(用小写字母 a-z 表示)或者是空格子(用 . 表示)。
  • 顾客需求

    • 给定的字符串 c 表示顾客希望购买的商品种类。
    • 每种商品的需求数量可能不止一个(即字符串 c 可能包含重复字母)。
  • 调整机会

    • 在顾客到来之前,可以重新排列货物架上的商品,但商品总数和种类不能改变。
    • 空格子位置可以任意调整。

解决方案详细步骤

步骤 1:统计顾客需求和货物架库存

  1. 统计顾客需求:

    • 对于顾客希望购买的商品种类 c,统计每种商品的需求数量。
  2. 统计货架上的商品库存:

    • 对于货物架上的商品顺序 s,统计每种商品的库存数量。
  3. 核心数据结构:

    • 用两个哈希表分别保存需求数量和库存:

      • demand[item]:记录顾客对商品 item 的需求数量。
      • stock[item]:记录货架上商品 item 的库存数量。

步骤 2:最大化售出商品数量

  1. 核心匹配规则:

    • 对于顾客需求的每种商品 item

      • 如果该商品在货架上有库存(即 stock[item] > 0),我们尽可能满足顾客的需求。
      • 如果库存充足,则售出数量为需求数量(demand[item])。
      • 如果库存不足,则售出数量为库存数量(stock[item])。
  2. 售出数量计算公式:

    • 对于每种商品: 售出数量=min⁡(需求数量,库存数量)
  3. 累加总售出数量:

    • 将所有匹配商品的售出数量相加,得到总售出商品数量。

步骤 3:货物架顺序优化

  1. 重新调整货物顺序:

    • 将顾客想要的商品尽量靠前排列。
    • 顾客不需要的商品尽量靠后或填入空格位置。
  2. 调整逻辑:

    • 根据顾客需求优先级排序货物:

      • 第一优先级:按需求出现的顺序排列。
      • 第二优先级:将顾客不需要的商品排到最后。

Python 实现

    def solution(n: int, m: int, s: str, c: str) -> int:
        stock = {}
        for item in s:
            if item != '.':  # 忽略空格子
                stock[item] = stock.get(item, 0) + 1

        # Step 2: 统计顾客需求
        demand = {}
        for item in c:
            demand[item] = demand.get(item, 0) + 1

        # Step 3: 计算最多能售出的商品数量
        sold = 0
        for item, req in demand.items():
            if item in stock:
                sold += min(stock[item], req)  # 计算实际售出数量

        return sold

复杂度分析

  1. 时间复杂度:

    • 统计库存和需求:O(n+m)
    • 售出商品计算:O(m)
    • 总复杂度:O(n+m)
  2. 空间复杂度:

    • 使用了两个哈希表保存库存和需求,空间复杂度为 O(n+m)。