算法-计算使得整型数组中所有元素均唯一的最小步数

本文介绍一种算法,用于求解使整型数组元素唯一所需的最小步数,通过逐步增加重复元素至未出现过的值,实现数组元素的唯一化。算法采用计数策略,分析数组中各元素的出现频率,从而高效地计算出最少操作次数。

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

简要介绍

随机给出一个整型数组,求出使得数组内元素唯一的最小步数,要求每次仅增加1

算法描述

假设我们有数组{1,1,1,1,3,5},其中1出现了4次,我们只需要将另外三个数		
字1逐步增加至未出现过的值即可,给定taken = 3,ans = -3,
之后为ans += 2,ans += 4,ans += 6,即得出ans = 9,至少需要9步才能	
使得数组内元素唯一

代码

 public static int minIncrementForUnique(int[] A){
    int[] count = new int[100000];
    for( int x : A) count[x]++;
    int ans = 0,taken = 0;
    for( int x = 0; x < 100000; ++x){
        if(count[x] >= 2){
            taken += count[x] - 1;
            ans -= x * (count[x] - 1);
        } else if(taken > 0 && count[x] == 0){
            taken--;
            ans += x;
        }
    }
    return ans;
}

复杂度分析

N代表数组的长度,时间复杂度为 O(N);空间复杂度为O(N)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值