comments | difficulty | edit_url | tags | ||||
---|---|---|---|---|---|---|---|
true |
Medium |
|
You are given an integer array nums
. In one move, you can pick an index i
where 0 <= i < nums.length
and increment nums[i]
by 1
.
Return the minimum number of moves to make every value in nums
unique.
The test cases are generated so that the answer fits in a 32-bit integer.
Example 1:
Input: nums = [1,2,2] Output: 1 Explanation: After 1 move, the array could be [1, 2, 3].
Example 2:
Input: nums = [3,2,1,2,1,7] Output: 6 Explanation: After 6 moves, the array could be [3, 4, 1, 2, 5, 7]. It can be shown with 5 or less moves that it is impossible for the array to have all unique values.
Constraints:
1 <= nums.length <= 105
0 <= nums[i] <= 105
class Solution:
def minIncrementForUnique(self, nums: List[int]) -> int:
nums.sort()
ans = 0
for i in range(1, len(nums)):
if nums[i] <= nums[i - 1]:
d = nums[i - 1] - nums[i] + 1
nums[i] += d
ans += d
return ans
class Solution {
public int minIncrementForUnique(int[] nums) {
Arrays.sort(nums);
int ans = 0;
for (int i = 1; i < nums.length; ++i) {
if (nums[i] <= nums[i - 1]) {
int d = nums[i - 1] - nums[i] + 1;
nums[i] += d;
ans += d;
}
}
return ans;
}
}
class Solution {
public:
int minIncrementForUnique(vector<int>& nums) {
sort(nums.begin(), nums.end());
int ans = 0;
for (int i = 1; i < nums.size(); ++i) {
if (nums[i] <= nums[i - 1]) {
int d = nums[i - 1] - nums[i] + 1;
nums[i] += d;
ans += d;
}
}
return ans;
}
};
func minIncrementForUnique(nums []int) (ans int) {
sort.Ints(nums)
for i := 1; i < len(nums); i++ {
if nums[i] <= nums[i-1] {
d := nums[i-1] - nums[i] + 1
nums[i] += d
ans += d
}
}
return
}
function minIncrementForUnique(nums: number[]): number {
nums.sort((a, b) => a - b);
let ans = 0;
for (let i = 1; i < nums.length; ++i) {
if (nums[i] <= nums[i - 1]) {
ans += nums[i - 1] - nums[i] + 1;
nums[i] = nums[i - 1] + 1;
}
}
return ans;
}
According to the problem description, the maximum value of the result array cnt
to record the occurrence times of each element.
Then, we iterate from
After the iteration, we return the result.
The time complexity is nums
plus the maximum value in the array nums
.
class Solution:
def minIncrementForUnique(self, nums: List[int]) -> int:
m = max(nums) + len(nums)
cnt = Counter(nums)
ans = 0
for i in range(m - 1):
if (diff := cnt[i] - 1) > 0:
cnt[i + 1] += diff
ans += diff
return ans
class Solution {
public int minIncrementForUnique(int[] nums) {
int m = Arrays.stream(nums).max().getAsInt() + nums.length;
int[] cnt = new int[m];
for (int x : nums) {
++cnt[x];
}
int ans = 0;
for (int i = 0; i < m - 1; ++i) {
int diff = cnt[i] - 1;
if (diff > 0) {
cnt[i + 1] += diff;
ans += diff;
}
}
return ans;
}
}
class Solution {
public:
int minIncrementForUnique(vector<int>& nums) {
int m = *max_element(nums.begin(), nums.end()) + nums.size();
int cnt[m];
memset(cnt, 0, sizeof(cnt));
for (int x : nums) {
++cnt[x];
}
int ans = 0;
for (int i = 0; i < m - 1; ++i) {
int diff = cnt[i] - 1;
if (diff > 0) {
cnt[i + 1] += diff;
ans += diff;
}
}
return ans;
}
};
func minIncrementForUnique(nums []int) (ans int) {
m := slices.Max(nums) + len(nums)
cnt := make([]int, m)
for _, x := range nums {
cnt[x]++
}
for i := 0; i < m-1; i++ {
if diff := cnt[i] - 1; diff > 0 {
cnt[i+1] += diff
ans += diff
}
}
return ans
}
function minIncrementForUnique(nums: number[]): number {
const m = Math.max(...nums) + nums.length;
const cnt: number[] = Array(m).fill(0);
for (const x of nums) {
cnt[x]++;
}
let ans = 0;
for (let i = 0; i < m - 1; ++i) {
const diff = cnt[i] - 1;
if (diff > 0) {
cnt[i + 1] += diff;
ans += diff;
}
}
return ans;
}