给你一个整数数组 nums
。每次 move 操作将会选择任意一个满足 0 <= i < nums.length
的下标 i
,并将 nums[i]
递增 1
。
返回使 nums
中的每个值都变成唯一的所需要的最少操作次数。
生成的测试用例保证答案在 32 位整数范围内。
示例 1:
输入:nums = [1,2,2] 输出:1 解释:经过一次 move 操作,数组将变为 [1, 2, 3]。
示例 2:
输入:nums = [3,2,1,2,1,7] 输出:6 解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。 可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
提示:
-
1 <= nums.length <= 10^5
-
0 <= nums[i] <= 10^5
我的解答
class Solution {public int minIncrementForUnique(int[] nums) {// 对数组进行排序Arrays.sort(nums);int res = 0;// 遍历排好序的数组for(int i = 1;i < nums.length; i++){// 如果当前元素等于上一元素,则该元素数值+1if(nums[i] == nums[i - 1]){nums[i]++;res++;}// 因为上面操作可能会打乱排好序的数组,所以需要处理错乱的元素// 如果当前元素小于上一元素(即排序错乱),则该元素数值需要增加至比前一元素的值要大// 即增加至比前一元素要大1的值,其操作次数为(上一元素的值 - 当前元素的值 + 1) else if(nums[i] < nums[i - 1]){res += nums[i - 1] - nums[i] + 1;nums[i] = nums[i - 1] + 1;}}return res;}
}