青训营X豆包MarsCode 技术训练 AI 刷题贪心猫的鱼干大分配| 豆包MarsCode AI 刷题”

78 阅读3分钟

在给定的猫等级列表中,我们需要确保每只猫根据相邻猫的等级差异,公平地分配鱼干。我们的目标是:

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

为了实现这一目标,我们采用贪心算法的策略,通过两次遍历来调整鱼干的分配:

  1. 从左到右遍历:确保每只猫如果等级高于左邻猫,则它的鱼干多于左邻猫。
  2. 从右到左遍历:确保每只猫如果等级高于右邻猫,则它的鱼干多于右邻猫。
  3. 最后,计算所有猫鱼干的总和。

图解

假设我们有以下猫等级列表:

Copy Code
猫等级: [1, 2, 2, 3, 3, 2, 4]

第一步:左到右遍历

  • 初始鱼干分配:[1, 1, 1, 1, 1, 1, 1]

  • 遍历过程:

    • 比较猫1和猫2:等级提高,猫2分配2斤,结果:[1, 2, 1, 1, 1, 1, 1]
    • 比较猫2和猫3:等级不变,分配不变,结果:[1, 2, 1, 1, 1, 1, 1]
    • 比较猫3和猫4:猫4等级提高,分配3斤,结果:[1, 2, 1, 2, 1, 1, 1]
    • 猫5和猫6等级相同,分配不变,结果:[1, 2, 1, 2, 1, 1, 1]
    • 比较猫6和猫7:猫7等级提高,分配2斤,结果:[1, 2, 1, 2, 1, 2, 1]

经过左到右遍历后的结果是:[1, 2, 1, 2, 1, 2, 1]

第二步:右到左遍历

  • 从右到左遍历调整:

    • 比较猫6和猫5:猫6等级高于猫5,分配调整为2斤,结果:[1, 2, 1, 2, 2, 2, 1]
    • 比较猫5和猫4:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
    • 比较猫4和猫3:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
    • 比较猫3和猫2:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]
    • 比较猫2和猫1:分配不变,结果:[1, 2, 1, 2, 2, 2, 1]

最终的分配结果是:[1, 2, 1, 2, 2, 2, 1]。

代码详解

pythonCopy Code
def solution(n, cats_levels):
    # 每只猫初始分配一斤鱼干
    fish_distribution = [1] * n
    
    # 从左到右遍历
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i - 1]:
            fish_distribution[i] = fish_distribution[i - 1] + 1
    
    # 从右到左遍历
    for i in range(n - 2, -1, -1):
        if cats_levels[i] > cats_levels[i + 1]:
            fish_distribution[i] = max(fish_distribution[i], fish_distribution[i + 1] + 1)
    
    # 计算总分配的鱼干数量
    total_fish = sum(fish_distribution)
    return total_fish

if __name__ == "__main__":
    cats_levels1 = [1, 2, 2]
    cats_levels2 = [6, 5, 4, 3, 2, 16]
    cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
    print(solution(3, cats_levels1) == 4)  # True
    print(solution(6, cats_levels2) == 17)  # True
    print(solution(20, cats_levels3) == 35)  # True

代码解释

  1. 初始化分配:创建一个与猫数量相同的列表 fish_distribution,每个元素初始化为1,表示每只猫至少得到一斤鱼干。

  2. 左到右遍历

    • 从第二只猫开始遍历,如果当前猫的等级高于左边的猫,更新当前猫的鱼干数量。
  3. 右到左遍历

    • 从倒数第二只猫开始遍历,进行类似的比较和更新,确保符合相邻猫的分配规则。
  4. 计算总和:最后,使用 sum() 函数计算并返回所有猫的鱼干总量。

这种方法时间复杂度为O(n),因为我们只遍历两次猫的列表,效率很高。