问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
解题思路的推导过程
-
理解问题:
- 每只猫至少得到1斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
-
初始化:
- 由于每只猫至少得到1斤鱼干,我们可以初始化一个数组
fish,其中每个元素初始值为1。
- 由于每只猫至少得到1斤鱼干,我们可以初始化一个数组
-
分析规则:
- 规则要求等级高的猫得到更多的鱼干。我们可以通过比较相邻猫的等级来确定每只猫的鱼干数。
-
从左到右遍历:
- 从第二只猫开始,依次检查每只猫的等级是否高于前一只猫。如果是,则当前猫的鱼干数应比前一只猫多1斤。这样可以确保每只猫的鱼干数满足从左到右的等级要求。
-
从右到左遍历:
- 从倒数第二只猫开始,依次检查每只猫的等级是否高于后一只猫。如果是,并且当前猫的鱼干数不大于后一只猫,则当前猫的鱼干数应比后一只猫多1斤。这样可以确保每只猫的鱼干数满足从右到左的等级要求。
-
求和:
- 将所有猫的鱼干数相加,得到总鱼干数。
数据结构选择
- 使用一个数组
fish来存储每只猫的鱼干数。
复杂度分析
- 时间复杂度:O(n),其中n是猫的数量。因为我们需要遍历两次数组。
- 空间复杂度:O(n),用于存储每只猫的鱼干数。
代码实现
public static int solution(int n, List<Integer> cats_levels) {
// Please write your code here
if (n == 0) return 0;
// 初始化
int[] fish = new int[n];
for (int i = 0; i < n; i++) {
fish[i] = 1;
}
// 从左到右遍历
for (int i = 1; i < n; i++) {
if (cats_levels.get(i) > cats_levels.get(i - 1)) {
fish[i] = fish[i - 1] + 1;
}
}
// 从右到左遍历
for (int i = n - 2; i >= 0; i--) {
if (cats_levels.get(i) > cats_levels.get(i + 1) && fish[i] <= fish[i + 1]) {
fish[i] = fish[i + 1] + 1;
}
}
// 计算总和
int totalFish = 0;
for (int f : fish) {
totalFish += f;
}
return totalFish;
}
关键点
- 初始化:每只猫至少得到1斤鱼干。
- 两次遍历:从左到右和从右到左各一次,确保每只猫的鱼干数满足题目要求。
- 求和:将所有猫的鱼干数相加,得到总鱼干数。
心得
这道题和分发糖果类似,复习了一下解题思路。