leetcode 945. 使数组唯一的最小增量 python

leetcode 945.

题目描述

在这里插入图片描述

题解

想要找思路,先自己解一遍题吧。然后发现只要遇到断节的地方就行了。比如:[3,2,1,2,1,7],1~3都有了,4没有,所以就可以把第二个2加到4,然后4就有了,就要找下一个没有出现过的数,比如5…以此类推,所以想到用一个变量记录没出现过的最小数。但是这个数其实很难找,首先从整个列表的最小值开始找起,递增一个个对比着去找,很麻烦。而且找到之后,更新了,下一个数又得再找,非常麻烦。所以这个思路不行…

接着我就去看题解了,发现一种很好理解的方法,先排序!排完序之后,所有相同的数字都会靠在一起了。整个解题过程如下,排序的好处有两点,一是相同的数都在一起了,二是按顺序排列,断节的地方很容易就找到了,只要和前一个数比较就行了。

那么这里与前一个数比较,也分3种情况

  1. 大于前一个数,这个就不用变了
  2. 等于前一个数,+1就行了
  3. 小于前一个数,因为排过序了,所以它会比前面的数小,肯定是因为前面的数进行了+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

总结

发布了28 篇原创文章 · 获赞 11 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/xxx_gt/article/details/105030970