给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。
示例 1:
输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
示例 2:
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
链接:https://leetcode.com/problems/minimum-increment-to-make-array-unique/
解题思路:
首先用hashmap统计各个元素出现的次数,对于出现次数超过1的,采用线性探测法向后探测数组中未出现的数字空位,同时记录move的大小。
我的代码:
class Solution(object):
def minIncrementForUnique(self, A):
"""
:type A: List[int]
:rtype: int
"""
if not A:
return 0
h = {}
res = 0
# 统计次数
for a in A:
h[a] = h.get(a, 0) + 1
# i初始化
i = min(A) + 1
for key in h:
# 确定探测起点
i = max(i, key + 1)
while h[key] > 1:
if i not in h: # 找到一个空位
res += i - key
h[key] -= 1
i += 1
return res
Time: O(N)
Space: O(1)