贪心猫的鱼干大分配题解 | 豆包MarsCode AI 刷题

39 阅读3分钟

这道题目是一个典型的分发奖励类问题,要求我们根据猫的等级分配鱼干,并且满足两个条件:

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

题目分析

  1. 给定一个猫的等级列表,我们要为每只猫分配鱼干。每只猫至少分到1斤鱼干,但如果猫的等级较高,它应得到比相邻猫更多的鱼干。
  2. 要考虑两个方向:从左到右和从右到左。因为猫的等级关系是相对的,也就是猫的鱼干分配依赖于它的相邻猫。

解法思路

我们可以使用贪心算法解决这个问题,分为两遍遍历:

  1. 从左到右遍历:如果当前猫的等级高于前一只猫的等级,则当前猫应分配比前一只猫更多的鱼干。
  2. 从右到左遍历:如果当前猫的等级高于后一只猫的等级,则当前猫应分配比后一只猫更多的鱼干。并且,如果左侧的分配已经较大,我们需要保留较大的分配值。

步骤

  1. 初始化每只猫至少得到1斤鱼干。
  2. 从左到右遍历,检查每只猫与前一只猫的等级关系,更新鱼干分配。
  3. 从右到左遍历,检查每只猫与后一只猫的等级关系,更新鱼干分配,确保不降低左边的分配。
  4. 最后,求所有猫鱼干的总和。

时间复杂度

  • 由于我们进行了两次遍历,每次遍历的时间复杂度为 O(n)O(n)O(n),其中 nnn 是猫的数量。因此,总的时间复杂度为 O(n)O(n)O(n)。

代码实现


def solution(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)

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
    print(solution(6, cats_levels2))  # 输出 17
    print(solution(20, cats_levels3))  # 输出 35

详细解析

示例1:cats_levels = [1, 2, 2]

  1. 初始化每只猫的鱼干为 [1, 1, 1]

  2. 从左到右遍历:

第二只猫(等级2)比第一只猫(等级1)高,第二只猫的鱼干更新为 fish[1] = fish[0] + 1 = 2。 第三只猫(等级2)与第二只猫等级相同,所以鱼干保持为 fish[2] = 1

  1. 从右到左遍历:

没有必要更新,因为没有猫的等级比相邻的猫高。

  1. 最终鱼干分配为 [1, 2, 1],总和为 1 + 2 + 1 = 4

结论

通过上述分析和代码实现,我们能够高效地解决该问题,得到了正确的鱼干总数。在实际应用中,贪心策略通过局部的最优选择(每次通过相邻猫的等级关系更新鱼干)实现了全局最优解