分发鱼干问题:最少鱼干数量的计算 题解 | 豆包MarsCode AI刷题

47 阅读2分钟

分发鱼干问题:最少鱼干数量的计算

问题描述

在猫星球上,每只猫有一个等级,等级高的猫应该得到更多鱼干,规则如下:

  1. 每只猫至少得到1斤鱼干。
  2. 如果一只猫的等级高于相邻的猫,它应该得到比相邻猫更多的鱼干。

目标是计算满足规则的情况下,至少需要多少斤鱼干。


解题思路

核心思想

为了满足规则:

  1. 从左到右遍历,保证每只猫比左边等级低的猫分得的鱼干更多。
  2. 从右到左遍历,保证每只猫比右边等级低的猫分得的鱼干更多。
  3. 最终取两次遍历中每只猫所需的最大鱼干数量。

具体步骤

  1. 初始化:创建一个数组 candies(长度为猫的数量),初始每只猫分得1斤鱼干。

  2. 从左到右遍历

    • 如果当前猫的等级高于前一只猫,则 candies[i] = candies[i-1] + 1
  3. 从右到左遍历

    • 如果当前猫的等级高于后一只猫,则 candies[i] = max(candies[i], candies[i+1] + 1)
  4. 求和:遍历 candies 数组,计算鱼干总量。


算法复杂度

  • 时间复杂度:O(n),两次线性遍历。
  • 空间复杂度:O(n),存储每只猫的鱼干数量。

测试样例与代码实现

测试样例

  1. 输入:n = 3, cats_levels = [1, 2, 2]

    • 输出:4
    • 分发鱼干:[1, 2, 1]
  2. 输入:n = 6, cats_levels = [6, 5, 4, 3, 2, 16]

    • 输出:17
    • 分发鱼干:[6, 5, 4, 3, 2, 7]
  3. 输入:n = 20, cats_levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]

    • 输出:35

代码实现

def distribute_fish(n, cats_levels):
    # 初始化每只猫的鱼干数量为1
    fish = [1] * n

    # 从左到右遍历
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i - 1]:
            fish[i] = fish[i - 1] + 1

    # 从右到左遍历
    for i in range(n - 2, -1, -1):
        if cats_levels[i] > cats_levels[i + 1]:
            fish[i] = max(fish[i], fish[i + 1] + 1)

    # 计算总鱼干
    return sum(fish)

# 测试用例
print(distribute_fish(3, [1, 2, 2]))  # 输出:4
print(distribute_fish(6, [6, 5, 4, 3, 2, 16]))  # 输出:17
print(distribute_fish(20, [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]))  # 输出:35

总结

  • 双向遍历法:利用两次遍历,分别保证左边和右边的规则,效率高且直观。

  • 边界情况

    • 如果所有猫的等级相同,则每只猫分1斤。
    • 如果猫的等级单调递增或递减,则鱼干数量依次累加或递减。
  • 核心逻辑:结合相邻猫的等级差异动态调整鱼干分配数量。