题目描述
小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
解题思路
- 排序:首先对士兵的大小进行排序。排序后,相同的元素会聚集在一起,便于处理。
- 去重:遍历排序后的列表,确保每个士兵的大小都不同。如果当前士兵的大小与前一个士兵的大小相同,则需要增加当前士兵的大小,直到它与前一个士兵的大小不同。
- 计算增量:记录每次增加的大小,累加得到总增量。
数据结构与算法
- 数据结构:列表(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
关键步骤解释
- 排序:
a.sort()对士兵的大小进行排序,这样可以更容易地处理重复大小的情况。 - 去重:在
for循环中,检查当前士兵的大小是否小于或等于前一个士兵的大小。如果是,则需要增加当前士兵的大小,直到它大于前一个士兵的大小。 - 计算增量:每次增加的大小累加到
sum中,最终返回sum。
解释
- 边界条件:通过从
1开始遍历,可以避免访问a[-1],从而避免潜在的错误。 - 逻辑简化:
1 < i < n是多余的,因为for循环的范围已经确保了i在1到n-1之间。
复杂度分析
- 时间复杂度:排序的时间复杂度为
O(n log n),遍历的时间复杂度为O(n)。因此,总的时间复杂度为O(n log n)。 - 空间复杂度:除了输入数组外,额外使用的空间为常数级别,因此空间复杂度为
O(1)。
总结
通过排序和遍历,我们可以有效地确保所有士兵的大小都不同,并计算出所需的最小橡皮泥增量。这个方法简单且高效,适用于大多数情况。 希望这篇笔记对您有所帮助,让我们在青训营学习中共同进步! 如果有任何问题,请随时提问。