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

192 阅读4分钟

题目解析

题目:贪心猫的鱼干大分配

在一排猫中,每只猫都有一个等级,等级越高的猫应该得到更多的鱼干。需要遵循以下规则:

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

目标是计算满足以上条件所需的最少鱼干总量。

测试样例:

  • 样例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. 正向遍历(从左到右)
    • 如果当前猫的等级高于左边的猫,那么它的鱼干数量应比左边的猫多一斤。
  2. 反向遍历(从右到左)
    • 如果当前猫的等级高于右边的猫,那么它的鱼干数量应至少比右边的猫多一斤。

通过这两次遍历,可以确保每只猫都满足与相邻猫的等级和鱼干数量关系。

代码实现

def solution(n, cats_levels):
    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)   # 输出:True
    print(solution(6, cats_levels2) == 17)  # 输出:True
    print(solution(20, cats_levels3) == 35) # 输出:True

代码详解:

  • 初始化
    • fish = [1] * n:每只猫至少得到一斤鱼干,初始化鱼干列表。
  • 正向遍历
    • 从第二只猫开始,如果当前猫的等级高于左边的猫,fish[i] = fish[i - 1] + 1,鱼干数量比左边的猫多一斤。
  • 反向遍历
    • 从倒数第二只猫开始,如果当前猫的等级高于右边的猫,fish[i] = max(fish[i], fish[i + 1] + 1),取当前鱼干数量和右边猫鱼干数量加一的较大值,确保满足条件。
  • 结果
    • return sum(fish):计算总共需要的鱼干数量。

知识总结

贪心算法

  • 定义:贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法。
  • 应用场景:适用于可以通过局部最优解得到全局最优解的问题,如最小生成树、活动选择问题等。
  • 特点
    • 不回溯:一旦做出选择,就不会再改变。
    • 局部最优:每一步都选择最优解。

双遍历技巧

  • 目的:解决需要同时考虑前后元素关系的问题,确保所有条件都被满足。
  • 方法
    • 正向遍历:从前往后遍历,处理顺序关系。
    • 反向遍历:从后往前遍历,处理逆序关系。
  • 应用:常用于需要比较相邻元素的场景,如本题、数组的波峰波谷问题等。

学习建议

学习建议: 对于入门同学,理解每一步操作的必要性尤为重要。可以先从简单的排序与索引计算练习起,再慢慢结合百分位概念,增强对数据处理的熟悉度。

学习计划

  1. 每日刷题:从简单的排序题目开始,逐渐加深理解。在掌握基本数组操作后,循序渐进地增加百分位、分位计算等题型。
  2. 错题复习:记录错题,通过豆包MarsCode AI查看代码解析,分析错因,制定复习计划,尤其关注四舍五入等细节处理。

工具运用

将豆包MarsCode AI与其他编程学习资源结合,是提高刷题效率的关键:

  • 解题思路与代码模板参考:当遇到问题卡住时,可询问MarsCode AI获得提示
  • 刷题笔记的编写:借助 AI 的功能,把题目解析收集并记录笔记,以日后复习加深理解。
  • 和社区交流:将自己的解题心得分享在刷题社区,或查看他人分享的解题思路,拓展不同思路和解法。

这样结合刷题资源和学习工具的使用,可以更高效地掌握算法题的解题技巧。

学习心得

在学习算法的过程中,理解算法思想比记忆代码更为重要。通过大量的练习和总结,可以逐步培养算法直觉,提高解题效率。同时,良好的学习习惯和计划能够帮助我们事半功倍。希望以上的学习笔记对大家有所帮助,一起加油!