问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
算法选择
贪心
算法思路
- 初始化:首先,我们创建一个长度为
n的数组fishes,并将所有元素初始化为 1,表示每只猫至少得到一斤鱼干。 - 从左到右遍历:我们从左到右遍历猫的等级列表
cats_levels。如果当前猫的等级高于它左边的猫,那么当前猫得到的鱼干数量应该比左边的猫多一斤。这样,我们可以确保从左到右的顺序满足条件。 - 从右到左遍历:接下来,我们从右到左遍历猫的等级列表
cats_levels。如果当前猫的等级高于它右边的猫,那么当前猫得到的鱼干数量应该比右边的猫多一斤。这样,我们可以确保从右到左的顺序也满足条件。在更新fishes数组时,我们需要取当前值和新计算值中的最大值,以确保满足所有条件。 - 计算总鱼干数量:最后,我们将
fishes数组中的所有元素相加,得到总鱼干数量。
代码展示
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static int solution(int n, List<Integer> cats_levels) {
// Please write your code here
int sum = 0;
int[] fishes = new int[n];
Arrays.fill(fishes, 1);
for (int i = 0; i < n; i++) {
if (i > 0 && cats_levels.get(i) > cats_levels.get(i - 1)) {
fishes[i] = fishes[i - 1] + 1;
}
}
for (int i = n - 1; i >= 0; i--) {
if (i < n - 1 && cats_levels.get(i) > cats_levels.get(i + 1)) {
fishes[i] = Math.max(fishes[i + 1] + 1, fishes[i]);
}
}
for(int i = 0; i < n; i++){
sum += fishes[i];
}
return sum;
}
}