Leetcode945. 使数组唯一的最小增量--hammring

本文介绍了一种算法,用于解决给定整数数组中每个值都变成唯一的问题,通过最少的操作次数(递增元素)来实现。文章详细解析了示例,并提供了一个Java代码实现,使用计数法统计重复元素,最终计算出所需操作的总次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目描述:

给定整数数组 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 操作是不能让数组的每个值唯一的。
提示:

1.0 <= A.length <= 40000
2.0 <= A[i] < 40000

题目思路:

1.已知0 <= A[i] < 40000,那么就是说有可能会出现40000个39999的情况,这样要使得数组值唯一,需要将其递增为 [39999, 40000, ..., 79998],因此用来统计的数组需要开到 79998

2.当p增加到x,q增加到y,需要进行(x+y)-(p+q)次操作。例如出现数组{1,1,1,1,2,3}时,发现有个四个1是一致的,附近有4,5,6三个数没有,那么就需要进行(4+5+6)-(1+1+1)=12次操作。

Java代码如下:(计数法)

class Solution {
    public int minIncrementForUnique(int[] A) {
        int[] count = new int[79998];
        for(int x :A){
            count[x]++;
        }
        int m=0,n=0;
        for(int x=0;x<79998;x++){
            if(count[x]>=2){
                n += count[x]-1;
                m -=x*(count[x]-1);
            }else if(n>0 && count[x]==0){
                n--;
                m+=x;
            }
        }
        return m;

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值