56. 贪心猫的鱼干大分配
问题背景
一、题目解析
解题思路
要解决这个问题,我们需要两次遍历:
- 左向右遍历:保证每只猫比它左边等级低的猫分得更多鱼干。
- 右向左遍历:保证每只猫比它右边等级低的猫分得更多鱼干。
这种两次遍历的方法,实际上是在寻找一种平衡,确保每只猫的鱼干数量既满足自身等级的需求,又不 超出相邻猫的鱼干数量。
实现步骤
- 初始化一个数组
candies,长度与猫数量相等,初始值都为1(每只猫至少获得一斤)。 - 从左向右遍历:如果当前猫等级高于左边的猫,更新其鱼干数量为
candies[i] = candies[i-1] + 1。 - 从右向左遍历:如果当前猫等级高于右边的猫,更新为
candies[i] = max(candies[i], candies[i+1] + 1)。 - 求和
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 刷题功能,总结了以下知识点:
-
动态规划思想的应用
- 动态规划不仅能解决经典问题(如背包、最长公共子序列),在分配问题中也有很好的应用。
- 在这题中,通过两次遍历实现了“局部最优到全局最优”的过渡,这种思路可以迁移到更多分配与排序问题。
-
数组操作的优化
- 本题的时间复杂度为 O(n)O(n),空间复杂度为 O(n)O(n)。通过合理使用一个数组避免了额外的存储开销。
-
边界条件分析
- 刷题时,我通过 AI 的提示解决了边界问题(如只有一只猫时无需额外分配,直接返回1)。
三、学习计划
借助 豆包MarsCode AI 的功能,我设计了分阶段刷题策略:
- 第一阶段:选择简单、中等题(如本题)以熟悉题型,掌握基础解题技巧。
- 第二阶段:进一步挑战中等难度问题,注重优化算法性能。
- 第三阶段:攻克复杂问题,强化动态规划与图论等高级技巧。
四、工具运用
为了提高学习效率和深度,我将AI刷题功能与其他学习资源相结合:
- 制定每日任务: 每天设定具体的刷题任务,例如每天完成至少1道题目。任务要具体且可量化,这样更容易坚持下去。
- 利用错题进行针对性学习: 每次刷题后,将做错的题目记录下来,并注明错误原因。可以使用笔记本或电子表格记录,方便后续查看和复习。
- 持续跟踪学习数据,调整学习策略: 借助AI刷题工具,能够实时跟踪自己的学习进度,分析每个阶段的学习效果。
五、总结
通过这道题,我不仅熟悉了动态规划思想在分配问题中的应用,还复习了 Markdown 语法。希望这篇笔记能为大家提供帮助,也期待与各位在刷题路上共同进步!