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

45 阅读2分钟

题目描述:

)L_$V`1HLODD3)PIA0JXK8H.png

解题思路: 这个问题可以通过贪心算法来解决,核心在于确保每只猫得到的鱼干数量既符合其等级需求,又能满足相邻猫之间的等级差异。具体来说,我们需要从左到右遍历一次,然后再从右到左遍历一次,确保每个位置上的猫都能获得足够多的鱼干,同时满足所有相邻猫之间的等级差异。

首先,我们初始化一个长度为n的数组fish,用来存储每只猫应得的鱼干数量。初始时,所有猫都至少得到一斤鱼干,因此我们将fish数组中的所有元素都设为1。

接下来,我们从左到右遍历cats_levels数组。对于每只猫,如果它的等级高于它左边相邻的猫,那么这只猫应该比左边的猫多得一斤鱼干。因此,我们将当前猫的fish值设置为左边猫的fish值加1。这样做的目的是确保从左到右的顺序中,等级较高的猫能获得更多的鱼干。

然后,我们再从右到左遍历cats_levels数组。对于每只猫,如果它的等级高于它右边相邻的猫,那么这只猫应该比右边的猫多得一斤鱼干。但是,在这里我们需要使用max函数,确保当前猫的fish值不会小于它右边猫的fish值加1。这样做是为了避免重复增加鱼干数量,并确保从右到左的顺序中,等级较高的猫也能获得更多的鱼干。

最后,我们将fish数组中的所有元素相加,得到的结果就是小R至少需要准备的鱼干总重量。

这种算法的时间复杂度为O(n),因为我们需要两次遍历数组,每次遍历的时间复杂度都是O(n)。空间复杂度也是O(n),因为我们创建了一个与输入数组等长的辅助数组fish。通过这种方法,我们可以高效地计算出满足所有等级差异所需的最小鱼干总量,从而实现对所有猫的公平分配。

此外,该算法还具有一定的鲁棒性和灵活性。在相似的题目中,如果猫的等级信息发生变化,只需重新运行算法即可快速得出新的结果,而无需从头开始计算,可以推广到其他类似的情景,例如员工绩效奖金分配、学生评分排序等场景。

代码:

def solution(n, cats_levels):
    ans = 0
    fish = [1] * n
    for i in range(1, n):
        if cats_levels[i] > cats_levels[i-1]:
            fish[i] = fish[i-1] + 1
    for i in range(n-2, -1, -1):
        if cats_levels[i] > cats_levels[i+1]:
            fish[i] = max(fish[i], fish[i+1] + 1)
    ans = sum(fish)
    return ans