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

通过分析题意,发现解决这个问题的关键在于找到数组中的断节并进行适当的增量操作。首先尝试从数组中直接寻找未出现的最小数,但这种方法效率低下。然后采用排序数组的方法,使得相同数值的元素相邻,这样可以简化判断。在排序后的数组中,比较当前元素与前一个元素,根据比较结果进行相应操作:大于则不变,等于则加1,小于则需要加上它们之间的差值作为增量。最后提供解题代码并进行总结。
摘要由CSDN通过智能技术生成

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

总结

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值