青训营笔记刷题思路和感想
问题理解
我们需要给每只猫分配鱼干,满足以下两个条件:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它应该得到比相邻的猫更多的鱼干。
数据结构选择
我们可以使用一个数组 fish 来记录每只猫分配到的鱼干数量。初始时,每只猫至少得到一斤鱼干,即 fish[i] = 1。
算法步骤
- 初始化:创建一个长度为
n的数组fish,初始值为1。 - 从左到右遍历:检查每只猫与其右边相邻猫的等级关系,如果当前猫的等级高于右边相邻猫的等级,则增加当前猫的鱼干数量,直到满足条件。
- 从右到左遍历:检查每只猫与其左边相邻猫的等级关系,如果当前猫的等级高于左边相邻猫的等级,则增加当前猫的鱼干数量,直到满足条件。
- 计算总鱼干数:遍历
fish数组,累加所有猫的鱼干数量。
关键点
- 需要两次遍历数组,确保每只猫的鱼干数量满足条件。
- 在每次遍历中,需要动态调整鱼干数量,确保等级高的猫得到更多的鱼干。
通过解决这个题目,可以学到很多关于算法设计和问题解决的技巧。以下是一些主要的收获:
1. 问题分解与抽象
这个题目要求我们根据猫的等级来分配鱼干,确保每只猫的鱼干数量满足特定的条件。这需要我们将复杂的问题分解为更小的子问题,并通过抽象的方式来理解和解决这些子问题。例如,我们可以将问题分解为两个主要步骤:初始化鱼干数量和调整鱼干数量以满足等级差异。
2. 双遍历策略
在解决这个问题时,我们采用了双遍历策略:从左到右和从右到左。这种策略在处理数组或列表问题时非常常见,尤其是在需要考虑相邻元素关系的情况下。通过两次遍历,我们可以确保每个元素都满足其相邻元素的条件,从而避免了单次遍历可能遗漏的情况。
3. 动态调整与优化
在每次遍历时,我们需要动态调整鱼干数量,确保等级高的猫得到更多的鱼干。这种动态调整的思维方式在算法设计中非常重要,尤其是在需要优化资源分配或满足特定条件的情况下。通过动态调整,我们可以逐步逼近最优解,而不是一次性给出固定的解决方案。
4. 边界条件处理
在算法设计中,边界条件的处理往往是一个容易被忽视但非常重要的部分。在这个问题中,我们需要特别注意数组的第一个和最后一个元素,确保它们在遍历时不会出现越界错误。通过仔细处理边界条件,我们可以提高算法的鲁棒性。
5. 代码实现与调试
通过实际编写代码并进行调试,我们可以更好地理解算法的执行过程和可能出现的问题。在调试过程中,我们可以通过打印中间结果或使用断点来逐步检查算法的每一步,从而找到并修复潜在的错误。
总结
通过解决这个题目,我们不仅学会了如何设计一个满足特定条件的算法,还掌握了问题分解、双遍历策略、动态调整、边界条件处理和代码调试等重要的编程技巧。这些技巧在解决其他复杂问题时同样非常有用。