地址:
力扣https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique/
题目:
给你一个整数数组 nums 。每次 move 操作将会选择任意一个满足 0 <= i < nums.length 的下标 i,并将 nums[i] 递增 1。
返回使 nums 中的每个值都变成唯一的所需要的最少操作次数。
示例 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 <= 105 0 <= nums[i] <= 105 |
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-increment-to-make-array-unique
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
思路:
第一次居然题目都没有看懂到底要干啥
结合给定示例才明白,结论就是每次给你一次选定数组元素,将其值加1,如果加 1 后数组存有相同元素,那么你还要继续操做选定加 1
题目理解了,就好做了,排个升序
依次比较相邻元素,保证后一个元素值始终大于前一个元素的值,否则循环把值加到满足条件
方法一、升序排列,累加元素值
int cmp(const int *p1, const int *p2)
{
return (*(int*)p1) - (*(int*)p2);
}
int minIncrementForUnique(int* nums, int numsSize){
int i;
int cnt=0;
qsort(nums, numsSize, sizeof(int), cmp);
for(i=1; i<numsSize; i++)
{
while(nums[i] <= nums[i-1])
{
nums[i]++;
cnt++;
}
}
return cnt;
}
结束语:
题目看不太懂的时候,出去走一圈,结合给定示例继续理解
有时候理解完成了,复杂题目就一目了然了,比如这题编码都没有改错直接过