(Java解题)贪心:贪心猫的鱼干大分配 | 豆包MarsCode AI刷题

39 阅读2分钟

问题描述

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

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

解题思路的推导过程

  1. 理解问题

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

    • 由于每只猫至少得到1斤鱼干,我们可以初始化一个数组 fish,其中每个元素初始值为1。
  3. 分析规则

    • 规则要求等级高的猫得到更多的鱼干。我们可以通过比较相邻猫的等级来确定每只猫的鱼干数。
  4. 从左到右遍历

    • 从第二只猫开始,依次检查每只猫的等级是否高于前一只猫。如果是,则当前猫的鱼干数应比前一只猫多1斤。这样可以确保每只猫的鱼干数满足从左到右的等级要求。
  5. 从右到左遍历

    • 从倒数第二只猫开始,依次检查每只猫的等级是否高于后一只猫。如果是,并且当前猫的鱼干数不大于后一只猫,则当前猫的鱼干数应比后一只猫多1斤。这样可以确保每只猫的鱼干数满足从右到左的等级要求。
  6. 求和

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

数据结构选择

  • 使用一个数组 fish 来存储每只猫的鱼干数。

复杂度分析

  • 时间复杂度:O(n),其中n是猫的数量。因为我们需要遍历两次数组。
  • 空间复杂度:O(n),用于存储每只猫的鱼干数。

代码实现

    public static int solution(int n, List<Integer> cats_levels) {
        // Please write your code here
        if (n == 0) return 0;
        
        // 初始化
        int[] fish = new int[n];
        for (int i = 0; i < n; i++) {
            fish[i] = 1;
        }
        
        // 从左到右遍历
        for (int i = 1; i < n; i++) {
            if (cats_levels.get(i) > cats_levels.get(i - 1)) {
                fish[i] = fish[i - 1] + 1;
            }
        }
        
        // 从右到左遍历
        for (int i = n - 2; i >= 0; i--) {
            if (cats_levels.get(i) > cats_levels.get(i + 1) && fish[i] <= fish[i + 1]) {
                fish[i] = fish[i + 1] + 1;
            }
        }
        
        // 计算总和
        int totalFish = 0;
        for (int f : fish) {
            totalFish += f;
        }
        
        return totalFish;
    }
    

关键点

  • 初始化:每只猫至少得到1斤鱼干。
  • 两次遍历:从左到右和从右到左各一次,确保每只猫的鱼干数满足题目要求。
  • 求和:将所有猫的鱼干数相加,得到总鱼干数。

心得

这道题和分发糖果类似,复习了一下解题思路。