无意中翻起了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代码还写得这么长,应该还有蛮大的优化空间的。欢迎留言。