题目描述:
给定整数数组 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 操作是不能让数组的每个值唯一的。
提示:
1.0 <= A.length <= 40000
2.0 <= A[i] < 40000
题目思路:
1.已知0 <= A[i] < 40000,那么就是说有可能会出现40000个39999的情况,这样要使得数组值唯一,需要将其递增为 [39999, 40000, ..., 79998]
,因此用来统计的数组需要开到 79998
。
2.当p增加到x,q增加到y,需要进行(x+y)-(p+q)次操作。例如出现数组{1,1,1,1,2,3}时,发现有个四个1是一致的,附近有4,5,6三个数没有,那么就需要进行(4+5+6)-(1+1+1)=12次操作。
Java代码如下:(计数法)
class Solution {
public int minIncrementForUnique(int[] A) {
int[] count = new int[79998];
for(int x :A){
count[x]++;
}
int m=0,n=0;
for(int x=0;x<79998;x++){
if(count[x]>=2){
n += count[x]-1;
m -=x*(count[x]-1);
}else if(n>0 && count[x]==0){
n--;
m+=x;
}
}
return m;
}
}