问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
题目解析
题目描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
解题思路
-
理解问题:
- 每只猫至少得到1斤鱼干。
- 如果一只猫的等级高于相邻的猫,它应该得到比相邻的猫更多的鱼干。
-
数据结构选择:
- 使用一个列表
fish_amounts来记录每只猫的鱼干数量。
- 使用一个列表
-
算法步骤:
- 初始化每只猫的鱼干数量为1。
- 从左到右遍历猫的等级列表,确保每只猫的鱼干数量满足条件。
- 从右到左遍历猫的等级列表,再次确保每只猫的鱼干数量满足条件。
- 计算总的鱼干数量并返回。
图解
假设有以下猫的等级列表 [1, 2, 2]:
- 初始化鱼干数量:
[1, 1, 1] - 从左到右遍历:
- 第二只猫等级高于第一只猫,鱼干数量变为
[1, 2, 1]
- 第二只猫等级高于第一只猫,鱼干数量变为
- 从右到左遍历:
- 第三只猫等级等于第二只猫,鱼干数量不变
[1, 2, 1]
- 第三只猫等级等于第二只猫,鱼干数量不变
- 总鱼干数量:
1 + 2 + 1 = 4
代码详解
public static int solution(int n, List<Integer> cats_levels) {
// 初始化每只猫至少得到一斤鱼干
List<Integer> fish_amounts = new ArrayList<>();
for (int i = 0; i < n; i++) {
fish_amounts.add(1);
}
// 从左到右遍历,确保每只猫的鱼干数量满足条件
for (int i = 1; i < n; i++) {
if (cats_levels.get(i) > cats_levels.get(i - 1)) {
// 如果当前猫的等级高于前一只猫,增加鱼干数量
fish_amounts.set(i, fish_amounts.get(i - 1) + 1);
}
}
// 从右到左遍历,确保每只猫的鱼干数量满足条件
for (int i = n - 2; i >= 0; i--) {
if (cats_levels.get(i) > cats_levels.get(i + 1)) {
// 如果当前猫的等级高于后一只猫,增加鱼干数量
fish_amounts.set(i, Math.max(fish_amounts.get(i), fish_amounts.get(i + 1) + 1));
}
}
// 计算总的鱼干数量
int total_fish = 0;
for (int amount : fish_amounts) {
total_fish += amount;
}
return total_fish;
}
知识总结
新知识点
- 贪心算法:通过局部最优解来达到全局最优解。
- 双遍历:从左到右和从右到左两次遍历,确保每只猫的鱼干数量满足条件。
理解与建议
- 贪心算法的应用:在处理类似分配问题时,贪心算法通常能提供高效的解决方案。
- 双遍历的必要性:确保每只猫的鱼干数量在两个方向上都满足条件,避免遗漏。
学习计划
高效学习方法
-
制定刷题计划:
- 每天固定时间刷题,逐步增加题目难度。
- 每周总结错题,分析错误原因并进行针对性练习。
-
利用错题进行针对性学习:
- 记录错题,分析错误原因。
- 针对错误类型进行专项练习,巩固知识点。
工具运用
结合AI刷题功能
-
AI辅助分析:
- 使用AI工具分析代码,找出潜在问题和优化点。
- 利用AI生成测试用例,验证代码的正确性。
-
结合其他学习资源:
- 结合在线课程、书籍等资源,全面提升编程能力。
- 参与编程社区,与他人交流学习心得,共同进步。
通过以上方法,可以更高效地利用AI刷题功能,提升编程水平。