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

力扣:945. 使数组唯一的最小增量 题解(Java)

程序员文章站 2024-01-05 10:37:16
...

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

 

题目描述:

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

解题思路:

1.题目要求使数组A元素值不重复,遇到重复的值时,使A[i]增加至没有元素的值与它相等。即,例如数组2,2,3,3,4。数组中一个值为2的元素要变成5,一个值为3的元素要变成6;或者一个值为2的元素要变成6,一个值为3的元素要变成5,才能使数组元素的值唯一且增量之和最小

2.统计原数组中每个数字出现的次数,并声明一个容量为80000数组tem用于存储数字出现的次数。因为数组元素的值在[0,40000)之间,且数组最大有40000个元素.极端情况下,可能存在40000个39999。

3.统计完后,从i = 0开始遍历数组A,声明保存增量的变量move。

4.当tem[  A[i]   ]的值存超过1时,查找下一个tem[x]的值为零的x,tem[   A[i]   ]的值减一,令A[i] 的值为x,且tem[x] = 1。并存储A[i]的增量至move中

5.返回move。

代码:

class Solution {
    public int minIncrementForUnique(int[] A) {
        int[] tem = new int[50000];
        for(int i = 0; i < A.length; i++){
            tem[A[i]] += 1;
        }
        int ch = 0, move = 0;
        for(int i = 1; i < A.length;i++){
            if(tem[A[i]] > 1){
                tem[A[i]]--;
                ch = A[i];
                do{
                    move++;
                    ch++;
                } while(tem[ch] != 0);
                tem[ch]++;
            }
        }
        return move;
    }
}

 

相关标签: 力扣题解

上一篇:

下一篇: