独特的橡皮泥士兵 | 豆包Marscode AI刷题

86 阅读5分钟

题目重现

image.png

题目分析

  1. 首先需要确定每个士兵最终的大小,使得它们各不相同。可以考虑将所有士兵的大小进行排序,这样可以方便地确定每个士兵应该调整到的大小。
  2. 然后,依次遍历排序后的士兵数组,计算每个士兵需要增加的橡皮泥数量。对于第ii个士兵,它应该调整到比前i1i-1个士兵的大小都大的最小可能值。如果当前士兵的大小已经满足这个条件,则不需要增加橡皮泥;否则,需要增加相应的数量使得它满足条件。
  3. 最后,将所有士兵需要增加的橡皮泥数量累加起来,得到最终的结果。

代码实现

def solution(n, a):
    sorted_a = sorted(a)
    result = 0
    for i in range(len(sorted_a)):
        if i > 0 and sorted_a[i] <= sorted_a[i - 1]:
            to_add = sorted_a[i - 1] + 1 - sorted_a[i]
            result += to_add
            sorted_a[i] += to_add
    return result

if __name__ == '__main__':
    print(solution(5, [1, 1, 2, 3, 3]) == 5)
    print(solution(6, [4, 4, 4, 5, 5, 6]) == 11)
    print(solution(7, [10, 20, 10, 30, 40, 30, 20]) == 3)

函数分析

二、函数实现步骤

1. 排序输入数组

在处理士兵大小调整的问题时,我们首先要对输入的士兵大小数组 a 进行排序操作。这里我们选用 sorted(a) 函数来完成这个任务,通过该函数对数组 a 进行处理后,我们能够得到一个新的数组 sorted_a,它里面的元素是按照从小到大的顺序排列的。

为什么要进行这样的排序操作呢?这是因为经过排序后,我们在后续遍历数组的过程中,就可以按照从小到大的顺序依次考虑每个士兵的大小调整情况。这样一种有序的排列方式能够让我们更加清晰、有条理地去分析每个士兵相对于前一个士兵的大小关系,从而准确地计算出为了使每个士兵大小都不同所需增加的橡皮泥数量。

2. 遍历排序后的数组计算结果

初始化结果变量

在开始遍历排序后的数组 sorted_a 之前,我们需要先初始化一个用于存储最终结果的变量 result,将其初始值设置为 0。这个变量 result 的作用就是用来累加在遍历过程中为了让每个士兵大小不同而需要增加的橡皮泥的总数量。

开始遍历数组

接下来,我们使用 for 循环来遍历已经排序好的数组 sorted_a。在每次循环中,我们都要对当前位置的士兵大小情况进行仔细的分析和处理。

检查当前士兵与前一个士兵的大小关系

在循环体内部,我们首先要做的就是检查当前士兵的大小情况是否满足需要增加橡皮泥的条件。具体来说,我们会判断当前索引 i 是否大于 0,这是因为对于数组中的第一个元素(索引为 0),它前面没有其他元素可供比较,所以我们从索引为 1 的元素开始进行这种比较操作。

同时,我们还要判断当前士兵大小 sorted_a[i] 是否小于等于前一个士兵大小 sorted_a[i - 1]。如果这两个条件都满足,那就意味着当前士兵的大小与前一个士兵的大小相同或者更小,按照题目要求,这种情况下当前士兵就需要增加橡皮泥才能与前一个士兵大小不同。

计算需要增加的橡皮泥数量

当我们确定当前士兵需要增加橡皮泥时,接下来就要计算出具体需要增加多少橡皮泥才行。我们通过一个简单的公式来计算需要增加的橡皮泥数量 to_add,即 to_add = sorted_a[i - 1] + 1 - sorted_a[i]

这个公式的含义是:我们希望当前士兵的大小能够比前一个士兵的大小大 1,这样就能保证它们大小不同。所以我们用前一个士兵的大小加上 1,再减去当前士兵的大小,得到的差值就是需要增加到当前士兵身上的橡皮泥数量。

累加结果并更新当前士兵大小

计算出需要增加的橡皮泥数量 to_add 后,我们要将这个数量累加到结果变量 result 中,通过 result += to_add 这样的操作来实现。这一步骤能够不断地将每次为士兵增加橡皮泥的数量累加起来,最终得到为了使所有士兵大小都不同所需增加的橡皮泥的总数量。

同时,我们还需要更新当前士兵的大小,毕竟我们已经确定要给当前士兵增加一定数量的橡皮泥了。我们通过 sorted_a[i] += to_add 这样的操作,将计算出的需要增加的橡皮泥数量加到当前士兵的当前大小上,使得当前士兵的大小得到了相应的调整,以满足与前一个士兵大小不同的要求。

通过这样一轮又一轮的循环遍历和处理,我们就能够准确地计算出为了使输入数组 a 中的每个士兵大小都不同所需增加的橡皮泥的总数量,这个总数量就存储在最终的结果变量 result 中。

3. 返回结果

  • 最后函数返回result,即至少需要增加的橡皮泥单位数量。