945. Minimum Increment to Make Array Unique
DifficultyMedium
Description
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 that it is impossible for the array to have all unique values with 5 or less moves.
Constraints:
1 <= nums.length <= 1050 <= nums[i] <= 105
Solutions
Solution 1: Sorting + Greedy
Thinking
Each move increments one element; we want all values distinct at minimum cost. After sorting, each \(x\) should occupy the next free slot \(y\). Set \(y\leftarrow\max(y+1,x)\) and add \(y-x\).
First, we sort the array \(\textit{nums}\), and use a variable \(\textit{y}\) to record the current maximum value, initially \(\textit{y} = -1\).
Then, we iterate through the array \(\textit{nums}\). For each element \(x\), we update \(y\) to \(\max(y + 1, x)\), and accumulate the operation count \(y - x\) into the result.
After completing the iteration, we return the result.
The time complexity is \(O(n \log n)\), and the space complexity is \(O(\log n)\). Here, \(n\) is the length of the array \(\textit{nums}\).
1 2 3 4 5 6 7 8 | |
1 2 3 4 5 6 7 8 9 10 11 | |
1 2 3 4 5 6 7 8 9 10 11 12 | |
1 2 3 4 5 6 7 8 9 | |
1 2 3 4 5 6 7 8 9 | |
Solution 2: Counting + Greedy
Thinking
Sorting costs \(O(n\log n)\). With an upper bound \(m=\max+n\), a count array works: from low to high, the surplus \(cnt[i]-1\) copies of \(i\) move to \(i+1\), a linear sweep of the range.
According to the problem description, the maximum value of the result array \(m = \max(\textit{nums}) + \textit{len}(\textit{nums})\). We can use a counting array \(\textit{cnt}\) to record the occurrence count of each element.
Then, we iterate from \(0\) to \(m - 1\). For each element \(i\), if its occurrence count \(\textit{cnt}[i]\) is greater than \(1\), then we add \(\textit{cnt}[i] - 1\) elements to \(i + 1\), and accumulate the operation count into the result.
After completing the iteration, we return the result.
The time complexity is \(O(m)\), and the space complexity is \(O(m)\). Here, \(m\) is the length of the array \(\textit{nums}\) plus the maximum value in the array.
1 2 3 4 5 6 7 8 9 10 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | |