LeetCode笔记~945. 使数组唯一的最小增量

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(int[] A) {
    
    
        // 判空
        if(A.length == 0) return 0;
        // 初始化变量
        int move = 0;
		// 排序
        Arrays.sort(A);
		// 遍历该数组中元素
        for(int i = 1; i < A.length;i++){
    
    
            // 当前元素如果小于等于前面的元素,执行一次move操作
            while(A[i] <= A[i-1]){
    
    
                move++;
                A[i]++;
            }
        }
		// 返回最小增量
        return move;
    }
}

提交结果

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

第一时间没能想到啥好的方法,这个耗时简直辣眼睛∑(っ°Д°;)っ

还是贴一下执行用时分布图表里面大佬的代码缓解一下尴尬吧

class Solution {
    
    
    public int minIncrementForUnique(int[] A) {
    
    
        // 判空
        if(A == null || A.length == 0) {
    
    
            return 0;
        }
        // 初始化变量
        int[] status =  new int[50000];
        int counts = 0;
        int expect = 0;
		// 先统计数组中每位元素出现次数
        for(int num : A) {
    
    
            status[num]++;
        }
		// 变量新数组
        for(int i = 0; i < 50000; i++) {
    
    
            // 判断
            if(status[i] > 1) {
    
    
                expect = status[i] - 1; // 当前元素超过的数量
                counts += expect; // move操作次数
                status[i + 1] += expect; // 如下位元素出现次数大于1,则需继续执行move操作
                status[i] = 1; // 减少内存消耗
            }
        }
		// 返回结果
        return counts;
    }
}

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

果然大佬就是大佬,一开始我也是用的固定数组先把出现次数统计起来的,不过下面的循环判断写法不一样,导致提交超时,还是得多学习学习大佬的思路才行!

来源:力扣(LeetCode)
链接: https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/submissions/

猜你喜欢

转载自blog.csdn.net/CJG753951/article/details/105028141