即使生活忙碌,也要坚持刷题呀,哪怕每天消化一道题,但坚持一年之后也能手撕BAT等大厂的笔试题哦 ,快来跟我一起刷题吧。 ———— 坚持刷题的小鲨鱼
题目链接
题目描述
给定整数数组 A,每次 move 操作将会选择任意 A[i]
,并将其递增 1
。
返回使 A
中的每个值都是唯一的最少操作次数。
示例
输入:[3,2,1,2,1,7]
输出:6
解释:经过 6 次 move 操作,数组将变为 [3, 4, 1, 2, 5, 7]。
可以看出 5 次或 5 次以下的 move 操作是不能让数组的每个值唯一的。
思路 (图解)
贪心策略
每次只保证当前的数与后一个数不不同,即可保证所有的数均不同。
但是题目要求最小操作数,那我们便给数组排一下序,这样使得再操作数据的时候不做多余
的操作,便可获得最小的操作数。
些许潦草的图解
代码
class Solution {
public int minIncrementForUnique(int[] nums) {
int len = nums.length;
if(len == 0 || len == 1){
return 0;
}
int i = 0, count = 0;
Arrays.sort(nums);
while(i < len - 1){
if(nums[i] == nums[i+1] ){
nums[i+1] += 1;
count += 1;
}else if(nums[i] > nums[i+1]){
int res = nums[i] - nums[i+1] + 1;
nums[i+1] = nums[i] + 1;
count += res;
}
++i;
}
return count;
}
}
补充
走得慢总比停留在原地要好呀,总归也是在前进嘛。