题目内容
贪心猫的鱼干大分配
问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小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
我的思路:
-
初始化:每只猫至少得到一斤鱼干,因此初始化一个长度为
n的数组fish_amounts,每个元素初始值为 1。 -
从左到右遍历:
- 对于每只猫
i,如果它的等级cats_levels[i]高于它左边的猫cats_levels[i-1],则fish_amounts[i]应该至少比fish_amounts[i-1]多 1。 - 这样可以确保每只猫的鱼干数量满足从左到右的等级要求。
- 对于每只猫
-
从右到左遍历:
- 对于每只猫
i,如果它的等级cats_levels[i]高于它右边的猫cats_levels[i+1],则fish_amounts[i]应该至少比fish_amounts[i+1]多 1。 - 这样可以确保每只猫的鱼干数量满足从右到左的等级要求。
- 对于每只猫
-
返回结果:最终返回
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负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小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),适用于大规模数据集。