945. 使数组唯一的最小增量
1.题目描述及示例
-
题目描述
给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。 -
示例
2.题解思路及代码
- 思路
先排序,再依次遍历数组元素,若当前元素小于等于它前一个元素,则将其变为前一个数 +1。这是比较常规的方法,最屌的方法见第二个代码块 - 代码
//常规思路
public int minIncrementForUnique(int[] A) {
int sum=0;
Arrays.sort(A);
for (int i=1;i<A.length;i++)
{
if (A[i]<=A[i-1])
{
sum+=A[i-1]+1-A[i];
A[i]=A[i-1]+1;
}
}
return sum;
}
//这个思路更屌
public int minIncrementForUnique(int[] A) {
if(A.length < 2){
return 0;
}
int max = Integer.MIN_VALUE, res = 0;
for(int i = 0; i < A.length; i++){
max = max < A[i]? A[i]: max;
}
int[] count = new int[max + 1];
for(int i = 0; i < A.length; i++){
count[A[i]]++;
}
for(int i = 0; i < max; i++){
if(count[i] > 1){
res += count[i] - 1;
count[i + 1] += count[i] - 1;
}
}
res += count[max]*(count[max] - 1)/2;
return res;
}