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