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

80 阅读3分钟

56. 贪心猫的鱼干大分配

问题背景

问题.png


一、题目解析

解题思路

要解决这个问题,我们需要两次遍历:

  1. 左向右遍历:保证每只猫比它左边等级低的猫分得更多鱼干。
  2. 右向左遍历:保证每只猫比它右边等级低的猫分得更多鱼干。

这种两次遍历的方法,实际上是在寻找一种平衡,确保每只猫的鱼干数量既满足自身等级的需求,又不 超出相邻猫的鱼干数量。

实现步骤

  1. 初始化一个数组 candies,长度与猫数量相等,初始值都为1(每只猫至少获得一斤)。
  2. 从左向右遍历:如果当前猫等级高于左边的猫,更新其鱼干数量为 candies[i] = candies[i-1] + 1
  3. 从右向左遍历:如果当前猫等级高于右边的猫,更新为 candies[i] = max(candies[i], candies[i+1] + 1)
  4. 求和 candies 中的所有值,即为最少需要准备的鱼干总量。

Python 代码实现

def solution(n, cats_levels):
    # 初始化每只猫至少得到1斤鱼干
    candies = [1] * n

    # 从左到右遍历
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i - 1]:
            candies[i] = candies[i - 1] + 1

    # 从右到左遍历
    for i in range(n - 2, -1, -1):
        if cats_levels[i] > cats_levels[i + 1]:
            candies[i] = max(candies[i], candies[i + 1] + 1)

    # 计算总鱼干数
    return sum(candies)

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)

二、知识总结

在实现这道题的过程中,结合 豆包MarsCode AI 刷题功能,总结了以下知识点:

  1. 动态规划思想的应用

    • 动态规划不仅能解决经典问题(如背包、最长公共子序列),在分配问题中也有很好的应用。
    • 在这题中,通过两次遍历实现了“局部最优到全局最优”的过渡,这种思路可以迁移到更多分配与排序问题。
  2. 数组操作的优化

    • 本题的时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。通过合理使用一个数组避免了额外的存储开销。
  3. 边界条件分析

    • 刷题时,我通过 AI 的提示解决了边界问题(如只有一只猫时无需额外分配,直接返回1)。

三、学习计划

借助 豆包MarsCode AI 的功能,我设计了分阶段刷题策略:

  • 第一阶段:选择简单、中等题(如本题)以熟悉题型,掌握基础解题技巧。
  • 第二阶段:进一步挑战中等难度问题,注重优化算法性能。
  • 第三阶段:攻克复杂问题,强化动态规划与图论等高级技巧。

四、工具运用

为了提高学习效率和深度,我将AI刷题功能与其他学习资源相结合:

  1. 制定每日任务: 每天设定具体的刷题任务,例如每天完成至少1道题目。任务要具体且可量化,这样更容易坚持下去。
  2. 利用错题进行针对性学习: 每次刷题后,将做错的题目记录下来,并注明错误原因。可以使用笔记本或电子表格记录,方便后续查看和复习。
  3. 持续跟踪学习数据,调整学习策略: 借助AI刷题工具,能够实时跟踪自己的学习进度,分析每个阶段的学习效果。

五、总结

通过这道题,我不仅熟悉了动态规划思想在分配问题中的应用,还复习了 Markdown 语法。希望这篇笔记能为大家提供帮助,也期待与各位在刷题路上共同进步!