题目:
给定整数数组 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 操作是不能让数组的每个值唯一的。
提示:
0 <= A.length <= 40000
0 <= A[i] < 40000
题目的理解:
错误解法1:
因为A的长度可能为0,所以需要先判断A的个数小于2的情况。
(1)获取数字不相同值的个数,求得哪个数字B是需要移动的,并且对B排序。
(2)将提供的数组A进行取集合,然后再排序得到C。
(3)取B中的值进行move操作,如果move后的值在C中存在,那么继续move。
(4)直到所有的值都move完成。
class Solution:
def minIncrementForUnique(self, A: List[int]) -> int:
if len(A) < 2:
return 0
from collections import Counter, defaultdict
count_dic = dict(Counter(A))
A_set_sorted = list(set(A))
A_set_sorted.sort()
many_number = defaultdict(int)
for key, value in count_dic.items():
if value > 1:
many_number[key] = value - 1
many_number = dict(sorted(many_number.items()))
point = A_set_sorted[0]
move_count = 0
for key, value in many_number.items():
if key > point:
point = key
A_set_sorted = list(filter(lambda x: x > point, A_set_sorted))
for index in range(value):
while True:
point += 1
if point not in A_set_sorted:
move_count += point - key
break
return move_count
非常的遗憾,运行超时了。
python实现
查看了解题,真的是简明啊。
class Solution:
def minIncrementForUnique(self, A: List[int]) -> int:
count = [0] * 80000
for x in A:
count[x] += 1
ans = taken = 0
for x in range(80000):
if count[x] >= 2:
taken += count[x] - 1
ans -= x * (count[x] - 1)
elif taken > 0 and count[x] == 0:
taken -= 1
ans += x
return ans
继续学习吧解题思路.
提交
每次碰到中等难度,就有点吃力啊,还要继续刷刷刷
// END 每次的挫折,是自己成功的起点
网友评论