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

163 阅读3分钟

image.png

题目描述

小R有一组橡皮泥士兵,它们的大小各不相同或非常接近。为了让每个士兵都更具独特性,小R希望确保所有士兵的大小都不相同。小R可以通过增加某些士兵的大小来实现这一目标。每次操作可以给某个士兵加一单位橡皮泥,以增加其大小。

给定士兵的数量 n 和每个士兵当前的大小的数组 a,计算为了使所有士兵的大小都不同,至少需要增加多少单位橡皮泥。

测试样例

样例1:

输入:n = 5 ,a = [1, 1, 2, 3, 3]
输出:5

样例2:

输入:n = 6 ,a = [4, 4, 4, 5, 5, 6]
输出:11

样例3:

输入:n = 7 ,a = [10, 20, 10, 30, 40, 30, 20]
输出:3

解题思路

  1. 排序:首先对士兵的大小进行排序。排序后,相同的元素会聚集在一起,便于处理。
  2. 去重:遍历排序后的列表,确保每个士兵的大小都不同。如果当前士兵的大小与前一个士兵的大小相同,则需要增加当前士兵的大小,直到它与前一个士兵的大小不同。
  3. 计算增量:记录每次增加的大小,累加得到总增量。

数据结构与算法

  • 数据结构:列表(List)
  • 算法:排序(Sorting)、遍历(Iteration)

代码实现

def solution(n: int, a: list) -> int:
    a.sort() 
    sum = 0
    for i in range(n):       
        if a[i]<=a[i-1]and i>0:  
            sum += a[i-1] - a[i] + 1
            a[i] = a[i-1]+1
    return sum

关键步骤解释

  1. 排序a.sort() 对士兵的大小进行排序,这样可以更容易地处理重复大小的情况。
  2. 去重:在 for 循环中,检查当前士兵的大小是否小于或等于前一个士兵的大小。如果是,则需要增加当前士兵的大小,直到它大于前一个士兵的大小。
  3. 计算增量:每次增加的大小累加到 sum 中,最终返回 sum

解释

  1. 边界条件:通过从 1 开始遍历,可以避免访问 a[-1],从而避免潜在的错误。
  2. 逻辑简化1 < i < n 是多余的,因为 for 循环的范围已经确保了 i 在 1 到 n-1 之间。

复杂度分析

  • 时间复杂度:排序的时间复杂度为 O(n log n),遍历的时间复杂度为 O(n)。因此,总的时间复杂度为 O(n log n)
  • 空间复杂度:除了输入数组外,额外使用的空间为常数级别,因此空间复杂度为 O(1)

总结

通过排序和遍历,我们可以有效地确保所有士兵的大小都不同,并计算出所需的最小橡皮泥增量。这个方法简单且高效,适用于大多数情况。 希望这篇笔记对您有所帮助,让我们在青训营学习中共同进步! 如果有任何问题,请随时提问。