数组
使数组唯一的最小增量
1. 题目描述
难易度:中等
给定整数数组 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
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique
2. 思路分析
- 对数组进行排序
- 遍历数组,每次取到的值和已经遍历过的数据最大值进行比较
- 具体细节看代码注释
3. 代码演示
import java.util.Arrays;
/**
* @Description TODO
* @Author YunShuaiWei
* @Date 2020/5/23 17:19
* @Version
**/
class Solution {
public int minIncrementForUnique(int[] A) {
if (A == null || A.length == 1 || A.length == 0) {
return 0;
}
//记录move次数
int num = 0;
//对数组进行排序
Arrays.sort(A);
//用k记录当前序列的最大值
int k = A[0];
for (int i = 1; i < A.length; i++) {
//当前值和最大值相等
if (A[i] == k) {
//最大值+1
k++;
//move次数+1
num++;
} else if (A[i] < k) {//当前值比最大值小
//需要move最大值和当前值差值再+1次
num += (k - A[i] + 1);
//最大值+1
k++;
} else {
//改变最大值为A[i]
k = A[i];
}
}
return num;
}
}