规则概述
- 基础分配:每只猫至少要得到一斤鱼干。
- 等级比较:如果一只猫的等级高于它相邻的猫,它就应该获得比邻近猫咪更多的鱼干。
问题分析
我们可以通过一些实例来理解这个问题。例如,如果有一行猫的等级如下:
- 猫1:等级3
- 猫2:等级1
- 猫3:等级2
- 猫4:等级4
根据上述规则,我们可以逐步分配鱼干:
- 猫1的等级高于猫2,所以猫1必须得到比猫2多的鱼干。我们可以给猫1 2斤,猫2 1斤。
- 猫3的等级高于猫2,但低于猫4,需要调整。猫3得到2斤,猫4则得3斤。
经过这样的逻辑推理,我们可以得出每只猫应该获得的鱼干量。
算法设计
为了找到最小的鱼干总量,我们可以采取以下步骤:
- 初始化:为每只猫分配1斤鱼干,因为每只猫至少需要1斤。
- 左到右遍历:从左到右遍历猫咪,如果前一只猫的等级高于当前猫的等级,则当前猫的鱼干量需要根据上一只猫的分配进行调整。
- 右到左遍历:从右到左再进行一次遍历,确保左侧和右侧的条件都得到满足。
- 总计分配:最后,计算所有猫获得的鱼干总量,即为小R需要准备的鱼干量。
复杂度分析
这个算法的时间复杂度为O(n),其中n是猫咪的总数。空间复杂度同样为O(n),用来保存每只猫的鱼干分配量。
代码
import java.util.ArrayList;
import java.util.List;
public class Main {
public static int solution(int n, List<Integer> cats_levels) {
// 中等题目偏简单一点
//创建数组初始化为1
int len = cats_levels.size();
int [] array = new int[len];
for(int i = 0 ; i < len ; i++){
array[i] = 1;
}
//处理第一个值
if(cats_levels.get(0) > cats_levels.get(1)){
array[0] ++;
}
//正向遍历一次
for (int i = 1; i < len; i++) {
if(cats_levels.get(i) > cats_levels.get(i - 1)){
array[i] = array[i - 1] + 1;
}
}
//反向遍历一次筛选遗漏的情况
for(int i = len - 1; i > 0; i--){
if(cats_levels.get(i - 1) > cats_levels.get(i) && array[i - 1] <= array[i]){
array[i - 1] = array[i] + 1;
}
}
int count = 0;
for(int i = 0 ;i < len ; i++){
count += array[i];
}
System.out.println(count);
return count;
}
public static void main(String[] args) {
List<Integer> catsLevels1 = new ArrayList<>();
catsLevels1.add(1);
catsLevels1.add(2);
catsLevels1.add(2);
List<Integer> catsLevels2 = new ArrayList<>();
catsLevels2.add(6);
catsLevels2.add(5);
catsLevels2.add(4);
catsLevels2.add(3);
catsLevels2.add(2);
catsLevels2.add(16);
List<Integer> catsLevels3 = new ArrayList<>();
catsLevels3.add(1);
catsLevels3.add(2);
catsLevels3.add(2);
catsLevels3.add(3);
catsLevels3.add(3);
catsLevels3.add(20);
catsLevels3.add(1);
catsLevels3.add(2);
catsLevels3.add(3);
catsLevels3.add(3);
catsLevels3.add(2);
catsLevels3.add(1);
catsLevels3.add(5);
catsLevels3.add(6);
catsLevels3.add(6);
catsLevels3.add(5);
catsLevels3.add(5);
catsLevels3.add(7);
catsLevels3.add(7);
catsLevels3.add(4);
System.out.println(solution(3, catsLevels1) == 4);
System.out.println(solution(6, catsLevels2) == 17);
System.out.println(solution(20, catsLevels3) == 35);
}
}