给定整数数组 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
开始的思路是直接暴力查询当前的数在数组中达到唯一的时候的move次数,使用hash表作为存储和查找对象
class Solution {
public int minIncrementForUnique(int[] A) {
int ans=0;
//Map<Integer,Integer> map = new HashMap();
Set<Integer> set = new HashSet();
for(int i=0;i<A.length;i++){
int tem = A[i];
while(set.contains(tem)){//循环检查值是否唯一
tem++;
ans++;
}
set.add(tem);
}
// for(int i=0;i<A.length;i++){
// if(map.containsKey(A[i])){
// map.put(A[i],map.get(A[i])+1);
// }else{
// map.put(A[i],1);
// }
// }
// for(int j=0;j<A.length;j++){
// int tem = A[j];
// while(map.size()<A.length&&map.containsKey(tem)&&map.get(tem)>1){
// map.put(tem,map.get(tem)-1);
// tem++;
// ans++;
// if(map.containsKey(tem)){
// map.put(tem,map.get(tem)+1);
// }
// }
// map.put(tem,1);
// }
return ans;
}
}
可惜的是提交超时了
第二种思路是先排序,让后比较相邻两个数的大小,只要前一个数大于等于后一个数,则对后一个数置为前一个数+1,具体代码如下
class Solution {
public int minIncrementForUnique(int[] A) {
int ans=0;
Arrays.sort(A);//排序
for(int i=0;i<A.length-1;i++){
if(A[i+1]<=A[i]){
int tem = A[i+1];
A[i+1]=A[i]+1;//赋值
ans+=A[i+1]-tem;//计算差值
}
}
return ans;
}
}