给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。
返回使 A 中的每个值都是唯一的最少操作次数。
示例一:
输入:[1,2,2]
输出:1
解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
示例二:
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
解题思路:
1、将数组排序;
2、如果前一个元素的值大于等于后一个,将前面元素的值+1赋予后面元素
3、计数值累加上后面元素增加的数据;
实现代码:
void Fastsort(int* A, int low, int high) {
int first = low;
int least = high;
if (low >= high) {
return;
}
int tem = A[low];
while (low<high) {
while (A[high] >= tem && low<high) {
high--;
}
A[low] = A[high];
while (A[low] <= tem && low<high) {
low++;
}
A[high] = A[low];
}
A[low] = tem;
Fastsort(A, first, low - 1);
Fastsort(A, low + 1, least);
}
int minIncrementForUnique(int* A, int ASize){
int count = 0;
Fastsort(A, 0, ASize - 1);
int temp = 0;
for (int i = 1; i<ASize; i++) {
if (A[i] <= A[i - 1]) {
temp = A[i];
A[i] = A[i - 1] + 1;
count += A[i] - temp;
}
}
return count;
}
运行结果: