【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代碼還寫得這麼長,應該還有蠻大的優化空間的。歡迎留言。

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