题目描述
题解
想要找思路,先自己解一遍题吧。然后发现只要遇到断节的地方就行了。比如:[3,2,1,2,1,7],1~3都有了,4没有,所以就可以把第二个2加到4,然后4就有了,就要找下一个没有出现过的数,比如5…以此类推,所以想到用一个变量记录没出现过的最小数。但是这个数其实很难找,首先从整个列表的最小值开始找起,递增一个个对比着去找,很麻烦。而且找到之后,更新了,下一个数又得再找,非常麻烦。所以这个思路不行…
接着我就去看题解了,发现一种很好理解的方法,先排序!排完序之后,所有相同的数字都会靠在一起了。整个解题过程如下,排序的好处有两点,一是相同的数都在一起了,二是按顺序排列,断节的地方很容易就找到了,只要和前一个数比较就行了。
那么这里与前一个数比较,也分3种情况
- 大于前一个数,这个就不用变了
- 等于前一个数,+1就行了
- 小于前一个数,因为排过序了,所以它会比前面的数小,肯定是因为前面的数进行了+1的操作,所以前面肯定有重复的数。因此就要再叠加不仅是+1,而是要将之前加过的都加上,就利用两个数的差来作为增量(这个例子就看下图的2就明白了)。
上代码
class Solution:
def minIncrementForUnique(self, A: List[int]) -> int:
if not A:
return 0
a = sorted(A)
res = 0
for i in range(1,len(a)):
if a[i]>a[i-1]:
continue
if a[i] == a[i-1]:
a[i] += 1
res += 1
if a[i] < a[i-1]:
t = a[i-1]-a[i]+1
a[i] += t
res += t
return res
总结