leetcode 945. 使数组唯一的最小增量

leetcode 945. 使数组唯一的最小增量

题目详情

题目链接
给定整数数组 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

我的代码

class Solution {
public:
    int minIncrementForUnique(vector<int>& A) {
        vector<int> nums(65535, false);
        int res = 0;
        for (int a: A) {
            if (!nums[a]) {
                nums[a] = true;
                continue;
            }
            for (int i = a + 1; i <= 65535; ++i) {
                if (!nums[i]) {
                    res += (i - a);
                    nums[i] = true;
                    break;
                }
            }
        }
        return res;
    }
};

我的成绩

执行结果:通过
执行用时 : 2140 ms, 在所有 C++ 提交中击败了5.26%的用户
内存消耗 : 43.4 MB, 在所有 C++ 提交中击败了6.25%的用户

一些想法

  1. 本道题踩了一个坑,虽然输入的数字是小于40000,但最后结果内的的数字不一定是小于40000。
  2. 本题我的做法比较简单,即判断当前数字是否之前已经存在,如果存在则加一继续判断,直至找到还不存在的数字。

执行用时为 44 ms 的范例

class Solution {
public:
    int minIncrementForUnique(vector<int>& A) {
        int i;
        int min;
        int counts[80000];
        
        
        memset(counts, 0, sizeof(int) * 80000);
        for(auto i: A) counts[i]++;
        
        min = 0;
        for(i = 0; i < 80000; i++)
        {
            if(counts[i] <= 1) continue;
            min += counts[i] - 1;
            counts[i + 1] += counts[i] - 1;
        }
        
        return min;
    }
};

思考

  1. 范例做法确实要比我的好,只做了两次循环。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值