[题记]使数组唯一的最小增量-leetcode
题目:使数组唯一的最小增量
给定整数数组 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
思路很简单,将这一数组从小到大排序,然后在对每个数进行操作就可以了。
直接上代码(c):
int cmp( const void *a, const void *b ) { return *( int *)a - *( int *)b; } int minIncrementForUnique(int* A, int ASize){ int ans = 0; qsort( A, ASize, sizeof(A[0]), cmp ); for( int i = 1; i < ASize; i++ ) { while( A[i] <= A[i-1] ) { A[i]++; ans++; } } return ans; }
由于这个方法是对每个数一步一步的增加的,所以当数字非常大的时候,耗时十分恐怖,最终结果:
其实不必一步一步来,要使数组唯一,move操作最少,那么每个数只需要比上一个数大1就可以了。
可以通过两个数的关系直接计算。
上代码(c):
int cmp( const void *a, const void *b ) { return *( int *)a - *( int *)b; } int minIncrementForUnique(int* A, int ASize){ int ans = 0; qsort( A, ASize, sizeof(A[0]), cmp ); for( int i = 1; i < ASize; i++ ) { if( A[i] <= A[i-1] ) { ans += A[i-1]-A[i]+1; A[i] = A[i-1]+1; } } return ans; }
最终结果:
舒服多了~
2020-03-22-10:59:24