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

5 阅读3分钟

问题描述

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

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

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


测试样例

样例1:

输入:n = 3, cats_levels = [1, 2, 2]
输出:4

样例2:

输入:n = 6, cats_levels = [6, 5, 4, 3, 2, 16]
输出:17

样例3:

输入: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,如果左边的等级或相等更高的话,就什么都不做。 再从右往左遍历,如果左边的等级比右边的高,左边就右边的猫的鱼干+1,如果右边的等级或相等更高的话,就什么都不做。

这样只需要遍历两次就能找到极小值对应的x的位置。

代码实现:

def solution(cat_count, levels):
    # 每只猫的初始鱼干分配为1斤
    fish = [1] * cat_count

    # 从左到右遍历
    for i in range(1, cat_count):
        if levels[i] > levels[i - 1]:
            fish[i] = fish[i - 1] + 1

    # 从右到左遍历
    for i in range(cat_count - 2, -1, -1):
        if levels[i] > levels[i + 1]:
            fish[i] = max(fish[i], fish[i + 1] + 1)

    # 计算总鱼干数量
    return sum(fish)
    
if __name__ == "__main__":
    #  You can add more test cases here
    cats_levels1 = [1, 2, 2]
    cats_levels2 = [6, 5, 4, 3, 2, 16]
    cats_levels3 = [1, 2, 2, 3, 3, 20, 1, 2, 3, 3, 2, 1, 5, 6, 6, 5, 5, 7, 7, 4]
    print(solution(3, cats_levels1) == 4)
    print(solution(6, cats_levels2) == 17)
    print(solution(20, cats_levels3) == 35)
  1. 初始化:首先给每只猫分配1斤鱼干。
  2. 从左到右遍历:检查每对相邻的猫,如果右边的猫等级更高,则确保其鱼干数量至少比左边的多1。
  3. 从右到左遍历:再次检查每对相邻的猫,但这次是从右向左,如果左边的猫等级更高,则需要保证它的鱼干数量至少比右边的多1。这里使用max函数是为了保持之前已经增加过的鱼干数量不被减少。
  4. 计算总和:最后,将所有猫所拥有的鱼干数量加起来,得到最终所需的最少鱼干总数。

代码实现过程

  • fish = [1] * cat_count 创建一个长度为cat_count的列表,每个元素初始化为1,表示初始时每只猫都有1斤鱼干。
  • 第一次循环(从左至右)确保了对于每一对左侧等级低于右侧等级的猫,右侧猫的鱼干数量会比左侧多至少1。
  • 第二次循环(从右至左)则确保了对于每一对右侧等级低于左侧等级的猫,左侧猫的鱼干数量也会相应地调整以满足条件。
  • 最后返回所有猫的鱼干数量之和作为结果。

结语

MarsCode AI刷题作为与LeetCode的竞争对手,LeetCode纯正的写代码固然让人欲罢不能,但是MarsCode集成了AI辅助刷题让人更加舒心,再也不会一题几小时还没思路的情况出现了。