青训营X豆包MarsCode 技术训练营第一课 | 豆包MarsCode AI 刷题

60 阅读2分钟

题目内容

贪心猫的鱼干大分配

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

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

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

测试样例

样例1:

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

样例2:

输入:n = 6, cats_levels = [6, 5, 4, 3, 2, 16] 输出:17

样例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

我的思路:

  1. 初始化:每只猫至少得到一斤鱼干,因此初始化一个长度为 n 的数组 fish_amounts,每个元素初始值为 1。

  2. 从左到右遍历

    • 对于每只猫 i,如果它的等级 cats_levels[i] 高于它左边的猫 cats_levels[i-1],则 fish_amounts[i] 应该至少比 fish_amounts[i-1] 多 1。
    • 这样可以确保每只猫的鱼干数量满足从左到右的等级要求。
  3. 从右到左遍历

    • 对于每只猫 i,如果它的等级 cats_levels[i] 高于它右边的猫 cats_levels[i+1],则 fish_amounts[i] 应该至少比 fish_amounts[i+1] 多 1。
    • 这样可以确保每只猫的鱼干数量满足从右到左的等级要求。
  4. 返回结果:最终返回 fish_amounts 数组中所有元素的和,即为所需的最少鱼干总数。

    def solution(n, cats_levels): # 初始化每只猫的鱼干数量为1 fish_amounts = [1] * n # 从左到右遍历,确保每只猫的鱼干数量满足条件 for i in range(1, n): if cats_levels[i] > cats_levels[i - 1]: fish_amounts[i] = fish_amounts[i - 1] + 1 # 从右到左遍历,确保每只猫的鱼干数量满足条件 for i in range(n - 2, -1, -1): if cats_levels[i] > cats_levels[i + 1]: fish_amounts[i] = max(fish_amounts[i], fish_amounts[i + 1] + 1) # 返回鱼干总数 return sum(fish_amounts)if name == "main": # You can add more test cases here 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. 问题背景与需求分析

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

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

小R需要计算出为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

2. 问题分解与算法选择

为了解决这个问题,我们需要设计一个算法来分配鱼干,使得每只猫的鱼干数量满足上述规则,并且总鱼干数量最少。这是一个典型的贪心算法问题,因为我们可以通过局部最优解来逐步构建全局最优解。

3. 贪心算法的基本思想

贪心算法的核心思想是每一步都选择当前最优的解决方案,希望通过局部最优解的累积达到全局最优解。在本问题中,我们需要确保每只猫的鱼干数量满足其等级要求,并且总鱼干数量最少。

4. 算法步骤详解

4.1 初始化

首先,我们初始化一个长度为 n 的数组 fish_amounts,每个元素初始值为 1。这表示每只猫至少得到一斤鱼干。

6. 算法复杂度分析

  • 时间复杂度:该算法的时间复杂度为 O(n),其中 n 是猫的数量。因为我们只需要遍历两次猫的等级数组,每次遍历的时间复杂度为 O(n)。
  • 空间复杂度:该算法的空间复杂度为 O(n),因为我们使用了一个长度为 n 的数组 fish_amounts 来存储每只猫的鱼干数量。

7. 算法优缺点分析

7.1 优点
  • 简单直观:该算法通过两次遍历即可解决问题,思路清晰,易于理解和实现。
  • 高效:时间复杂度为 O(n),适用于大规模数据集。
7.2 缺点
  • 贪心算法的局限性:贪心算法依赖于局部最优解,不一定能保证全局最优解。但在本问题中,通过两次遍历可以确保每只猫的鱼干数量满足所有条件,因此贪心算法是有效的。

8. 总结

通过贪心算法,我们成功解决了猫星球上的鱼干分配问题。该算法通过局部最优解的累积,逐步构建全局最优解,确保每只猫的鱼干数量满足其等级要求,并且总鱼干数量最少。算法的时间复杂度为 O(n),空间复杂度为 O(n),适用于大规模数据集。