贪心猫的鱼干大分配 | 豆包MarsCode AI刷题

67 阅读3分钟

问题描述

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:

  1. 每只猫至少得到一斤鱼干。
  2. 如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。

小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. 初始化

    • 每只猫至少得到一斤鱼干,所以首先将每只猫的鱼干数初始化为 1。

cats levels = [1, 1, 1, 1, 1, 1]

  1. 从左到右遍历

    • 从第二只猫开始,如果当前猫的等级高于前一只猫,则当前猫的鱼干数应比前一只猫多 1。

cats levels = [1, 1, 1, 1, 1, 2]

  1. 从右到左遍历

    • 从倒数第二只猫开始,如果当前猫的等级高于后一只猫,则当前猫的鱼干数应比后一只猫多 1。
    • 这里需要注意,如果当前猫的鱼干数已经比后一只猫的鱼干数多 1,则不需要再增加。

cats levels = [5, 4, 3, 2, 1, 2]

  1. 计算总鱼干数

    • 最后,将所有猫的鱼干数相加,得到总鱼干数。

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为例

  1. 初始化鱼干数组 O(n)
fish_amounts = [1] * n
  1. 从左到右遍历 O(n)
for i in range(1, n):
   if cats_levels[i] > cats_levels[i - 1]:
   fish_amounts[i] = fish_amounts[i - 1] + 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])
  1. 计算总鱼干数 O(n)
total_fish = sum(fish_amounts)

综上所述,所有步骤的时间复杂度都是 O(n),因此总的时间复杂度是 O(n)。

空间复杂度

  1. 鱼干数组
fish_amounts = [1] * n

这一步的空间复杂度是 O(n),因为你需要存储一个长度为 n 的数组。

  1. 其他变量

    • total_fish 是一个常数空间 O(1)。
    • i 和 j 是常数空间 O(1)。

综上所述,总的空间复杂度是 O(n)。