【LeetCode系列】Leet Code OJ 945. 使数组唯一的最小增量 [Difficulty:Middle]

无意中翻起了LeetCode,发现有每日一题的做法,毕竟工作了一年之后就没怎么刷过题目了,好奇点进去看看,一个middle的题目,感觉实际上应该是easy的题目把。没有用IDE,直接手撸了一段比较长的代码。

题目链接

怎么说呢?解题思路等于没有思路吧,看了下数据量大小,实际上就是O(n)复杂度的模拟,没有认真地想怎么优化。

以例子2来介绍,其中例子2中 【3,2,1,2,1,7】,可以直接使用桶排序,这边数据量为40000,为了节省空间使用的是dictionary,具体如下表:

key 1 2 3 4 5 7
value 2 2 1 0 0 1
总计需要移位的数 1 2 2 1 0  
计步 0 1 2 2 1  

位置1的时候,多了一个数需要往后移,因此总计需要移位的数有1个,往后移一步,计数为1

位置2的时候,依旧是多了一个数需要往后移,此时需要移位的数包括之前1的,共有2位,往后移一步,计数2

位置3的时候,原本只有一个数,所以1和2中的2个数还要继续往后移,往后移一步,计数2

位置4的时候,原本没有数,此时可以放下一个数,但是仍有一个数需要往后移动,因此计数1

位置5的时候,原本没有数,可以把剩下的那个数放下来了,这时候就没有数需要移位了,加0

位置7的时候,原本只有一位数,也没有必要移动,就加0

 

很简单的模拟操作,不详细说明了,直接上代码:

class Solution:
    def minIncrementForUnique(self, A: List[int]) -> int:
        dic = {}
        for v in A:
            if v not in dic:
                dic[v] = 1
            else:
                dic[v] += 1
        keys = sorted(dic)

        totalCnt = 0
        result = 0
        for k in keys:
            if dic[k] > 1:
                totalCnt += dic[k] - 1
                pos = k
                while totalCnt > 0:
                    result += totalCnt
                    pos += 1
                    if pos in dic:
                        totalCnt += dic[pos] - 1
                        dic[pos] = 1
                    else:
                        totalCnt -= 1
        return result

不过感觉python代码还写得这么长,应该还有蛮大的优化空间的。欢迎留言。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章