货架商品调整问题(贪心问题)刷题解析|豆包MarsCode AI刷题

71 阅读4分钟

今天在刷算法题时遇到了一道非常经典的贪心问题,目标是重新排列货物架上的商品,使得尽可能多的顾客能找到并购买商品。由于这道题难度适中且遇到的频率比较高,所以我今天分享一下我个人的解题思路和具体代码给大家,希望能抛砖引玉。下面从问题分析、代码解析、用例测试等方面逐步解答。

问题分析

在一个超市里,有一个包含n个格子的货物架,每个格子中放有一种商品,商品用小写字母 a 到 z 表示。当顾客进入超市时,他们会依次从第一个格子查找到第n个格子,寻找自己想要购买的商品。如果在某个格子中找到该商品,顾客就会购买它并离开;如果中途遇到一个空格子,或查找完所有格子还没有找到想要的商品,顾客也会离开。 作为超市管理员,你可以在顾客到来之前重新调整商品的顺序,以便尽可能多地出售商品。当第一个顾客进入后,商品位置不能再调整。你需要计算在最优调整下,最多可以卖出多少件商品。

  1. 输入信息:

• n:货物架的格子数。

• m:顾客想购买的商品种类数。

• s:货物架上的初始商品排列(包含小写字母和可能的空格,用 '.' 表示)。

• c:顾客想要购买的商品种类集合。

  1. 关键点:

• 空格子 '.' 不影响顾客查找商品,但会导致顾客停止查找。

• 商品顺序可以调整,但只能使用已有的商品,不能新增商品。

• 想要尽量满足顾客需求,需要优先考虑货物架上的商品和顾客的需求之间的匹配。

  1. 解决思路:

统计需求:计算每种商品的需求数量(由顾客 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(63"abcabc""a"))  # 输出 1
    print(solution(63"abcabc""abc"))  # 输出 3
    print(solution(63"abc...""abcd"))  # 输出 3
    print(solution(63"......""abc"))  # 输出 0
    print(solution(63"aabbcc""aaabbbccc"))  # 输出 6

代码解析

  1. 统计库存

• 遍历货物架上的商品字符串 s,计算每种商品的数量,存储在字典 inventory 中。

  1. 统计需求

• 遍历顾客的需求列表 c,统计每种商品的需求数量,存储在字典 demand 中。

  1. 匹配库存与需求

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

• 如果该商品在货物架上有库存,则计算该商品能卖出的最大数量:min(需求数量, 库存数量)。

• 将最大数量累加到 max_sales。

  1. 返回结果

• 返回最终计算的 max_sales。

复杂度分析

  1. 时间复杂度

• 统计库存:,遍历货物架上的商品。

• 统计需求:,遍历顾客的需求列表。

• 匹配库存与需求:。

总时间复杂度:

  1. 空间复杂度

• 使用字典 inventory 和 demand,空间复杂度为 ,其中 是商品种类的数量。

总空间复杂度:

测试用例分析

  1. 用例1

• 输入:n=6, m=3, s="abcabc", c="a"

• 分析:顾客只需要 a,货物架上有 2 个 a,因此能卖出 1 个。

• 输出:1

  1. 用例2

• 输入:n=6, m=3, s="abcabc", c="abc"

• 分析:顾客需要 a、b、c 各 1 个,货物架上每种商品都有 2 个,因此能卖出 3 个。

• 输出:3

  1. 用例3

• 输入:n=6, m=3, s="abc...", c="abcd"

• 分析:顾客需要 a、b、c 和 d,但货物架上没有 d,因此只能卖出 3 个。

• 输出:3

总结

该算法充分利用了贪心策略,优先满足顾客需求的同时,也保证了算法的高效性。