豆包56 贪心猫的鱼竿大分配

100 阅读2分钟

问题描述

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

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

小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干。

算法选择

贪心

算法思路

  1. 初始化:首先,我们创建一个长度为 n 的数组 fishes,并将所有元素初始化为 1,表示每只猫至少得到一斤鱼干。
  2. 从左到右遍历:我们从左到右遍历猫的等级列表 cats_levels。如果当前猫的等级高于它左边的猫,那么当前猫得到的鱼干数量应该比左边的猫多一斤。这样,我们可以确保从左到右的顺序满足条件。
  3. 从右到左遍历:接下来,我们从右到左遍历猫的等级列表 cats_levels。如果当前猫的等级高于它右边的猫,那么当前猫得到的鱼干数量应该比右边的猫多一斤。这样,我们可以确保从右到左的顺序也满足条件。在更新 fishes 数组时,我们需要取当前值和新计算值中的最大值,以确保满足所有条件。
  4. 计算总鱼干数量:最后,我们将 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;
    }
}