欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

[题记]使数组唯一的最小增量-leetcode

程序员文章站 2022-03-25 17:37:57
题目:使数组唯一的最小增量 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1。 返回使 A 中的每个值都是唯一的最少操作次数。 示例 1: 输入:[1,2,2]输出:1解释:经过一次 move 操作,数组将变为 [1, 2, 3]。示例 2: 输入:[3,2,1,2,1, ......

题目:使数组唯一的最小增量

 

给定整数数组 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;
}

由于这个方法是对每个数一步一步的增加的,所以当数字非常大的时候,耗时十分恐怖,最终结果:

[题记]使数组唯一的最小增量-leetcode

 

其实不必一步一步来,要使数组唯一,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;
}

最终结果:

[题记]使数组唯一的最小增量-leetcode

舒服多了~

 

2020-03-22-10:59:24