问题描述
在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
- 每只猫至少得到一斤鱼干。
- 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。
测试样例
样例一:
输入:
n=3,cats levels = [1,2,2]
输出:4
样例二:
输入:
n=6,cats levels = [6, 5, 4, 3, 2, 16]
输出:17
样例三:
输入:
n=20,cats levels = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
输出:35
解题思路
以样例二为例
-
初始化:
- 每只猫至少得到一斤鱼干,所以首先将每只猫的鱼干数初始化为 1。
cats levels = [1, 1, 1, 1, 1, 1]
-
从左到右遍历:
- 从第二只猫开始,如果当前猫的等级高于前一只猫,则当前猫的鱼干数应比前一只猫多 1。
cats levels = [1, 1, 1, 1, 1, 2]
-
从右到左遍历:
- 从倒数第二只猫开始,如果当前猫的等级高于后一只猫,则当前猫的鱼干数应比后一只猫多 1。
- 这里需要注意,如果当前猫的鱼干数已经比后一只猫的鱼干数多 1,则不需要再增加。
cats levels = [5, 4, 3, 2, 1, 2]
-
计算总鱼干数:
- 最后,将所有猫的鱼干数相加,得到总鱼干数。
5 + 4 + 3 + 2 + 1 + 2 = 17
代码实现
function solution(n, cats_levels) {
const fish = new Array(n).fill(1);
for(let i = 1; i < n; i++) {
if (cats_levels[i] > cats_levels[i-1]){
fish[i] = fish[i-1] + 1;
}
}
for (let j = n-2; j >= 0; j--) {
if (cats_levels[j] > cats_levels[j+1]) {
fish[j] = fish[j+1] + 1 > fish[j] ? fish[j+1] + 1 : fish[j];
}
}
const total = fish.reduce((sum, num) => sum + num, 0)
return total;
}
def solution(n, cats_levels):
# Initialize the fish amounts array with 1 for each cat
fish_amounts = [1] * n
# First pass: from left to right
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish_amounts[i] = fish_amounts[i - 1] + 1
# Second pass: from right to left
for j in range(n - 2, -1, -1):
if cats_levels[j] > cats_levels[j + 1]:
fish_amounts[j] = max(fish_amounts[j + 1] + 1, fish_amounts[j])
# Calculate the total fish amounts
total_fish = sum(fish_amounts)
return total_fish
时间复杂度
以python为例
- 初始化鱼干数组 O(n):
fish_amounts = [1] * n
- 从左到右遍历 O(n):
for i in range(1, n):
if cats_levels[i] > cats_levels[i - 1]:
fish_amounts[i] = fish_amounts[i - 1] + 1
- 从右到左遍历 O(n):
for j in range(n - 2, -1, -1):
if cats_levels[j] > cats_levels[j + 1]:
fish_amounts[j] = max(fish_amounts[j + 1] + 1, fish_amounts[j])
- 计算总鱼干数 O(n):
total_fish = sum(fish_amounts)
综上所述,所有步骤的时间复杂度都是 O(n),因此总的时间复杂度是 O(n)。
空间复杂度
- 鱼干数组:
fish_amounts = [1] * n
这一步的空间复杂度是 O(n),因为你需要存储一个长度为 n 的数组。
-
其他变量:
total_fish是一个常数空间 O(1)。i和j是常数空间 O(1)。
综上所述,总的空间复杂度是 O(n)。