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

54 阅读3分钟

8d90b572cd46f491b0504602090102b6.jpg

题目速览

在猫星球上,小R负责给一行排队的猫分发鱼干。每只猫有一个等级,等级越高的猫应该得到更多的鱼干。规则如下:
1.每只猫至少得到一斤鱼干。
2.如果一只猫的等级高于它相邻的猫,它就应该得到比相邻的猫更多的鱼干。
小R想知道,为了公平地满足所有猫的等级差异,他至少需要准备多少斤鱼干.

解题思路

  1. 题目中告诉我们,等级高的猫要得到比相邻的猫更多的鱼干。据此,们先来思考一下两种最简单的等级分布情况:

第一种情况,猫的等级分布如下:【1,2,3,4,5】,那么此时获得的需要鱼干数量为【1,2,3,4,5】

第二种情况,猫的等级分布如下:【5,4,3,2,1】,那么此时获得的需要鱼干数量为【5,4,3,2,1】

  1. 前面给出的两种情况是最理想,但是实际的等级分布可不是这种理想的单调情况,但我们可以发现,如果将这两种情况,按某种规则组装到一起,就可以构造出实际的等级分布。假设我们将两种基本等级分布情况依次交叉组合,就可以得到全新的等级分布【1,5,2,4,3,3,4,2,5,1】

  2. 2中得到全新等级分布【1,5,2,4,3,3,4,2,5,1】是由基本情况组合而来,那我们的解题思路就可以是将这种情况拆解回去,即进行两次遍历

一次遍历:正序,得到【1,2,1,2,1,1,2,1,2,1】
二次遍历,倒序,得到【1,2,1,2,1,1,2,1,2,1】

  1. 上面的情况两次遍历得到的最少鱼干数量的情况是一样的,因此,求解最少鱼干吧不需要特殊考虑。但如果是下面这种情况,我们就要考虑如何取舍两次遍历得到的鱼干数量

等级分布【1,2,4,3,2,1】
一次遍历:正序,得到【1,2,3,1,1,1】
二次遍历,倒序,得到【1,2,4,3,2,1】

  1. 根据题目的要求得到,等级高于相邻,就要比相邻的得到的更多,为满足这种情况,我们要取每一个等级处两次遍历得到鱼干数量的最大值,来保证题目的要求

等级分布【1,2,4,3,2,1】
一次遍历:正序,得到【1,2,3,1,1,1】
二次遍历,倒序,得到【1,2,4,3,2,1】
最终结果:取最大值,到【1,2,4,3,2,1】

详细代码

public static int solution(int n, List<Integer> catsLevels) {
        int length = catsLevels.size();
        int[] left = new int[length];
        int[] right = new int[length];
        Arrays.fill(left, 1);
        Arrays.fill(right, 1);
        // 正序遍历
        for(int i = 1; i < length; i++) {
            if(catsLevels.get(i) > catsLevels.get(i-1)) left[i] = left[i - 1] + 1;
        }
        int count = left[length - 1];
        // 倒序遍历
        for(int i = length - 2; i >= 0; i--) {
            if(catsLevels.get(i) > catsLevels.get(i+1)) right[i] = right[i + 1] + 1;
            // 取最大值,保证要求
            count += Math.max(left[i], right[i]);
        }
        return count;
    }

总结

大部分算法,尤其动态规划,我们可以先从最简单的情况入手分析,有时很多复杂的情况就是由最基础的情况演化而来。面对算法题,应该先考虑最普遍使用的情况,再考虑殊情况。