<p>You are given an integer array <code>nums</code>. In one move, you can pick an index <code>i</code> where <code>0 &lt;= i &lt; nums.length</code> and increment <code>nums[i]</code> by <code>1</code>.</p>

<p>Return <em>the minimum number of moves to make every value in </em><code>nums</code><em> <strong>unique</strong></em>.</p>

<p>The test cases are generated so that the answer fits in a 32-bit integer.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> nums = [1,2,2]
<strong>Output:</strong> 1
<strong>Explanation:</strong> After 1 move, the array could be [1, 2, 3].
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> nums = [3,2,1,2,1,7]
<strong>Output:</strong> 6
<strong>Explanation:</strong> 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.
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= nums.length &lt;= 10<sup>5</sup></code></li>
	<li><code>0 &lt;= nums[i] &lt;= 10<sup>5</sup></code></li>
</ul>

class Solution {
public:
    int minIncrementForUnique(vector<int>& nums) {
        int answer = 0;
        sort(nums.begin(), nums.end());
        vector<vector<int>> ranges;

        for(int i = 1; i < nums.size(); ++i)
            if (nums[i] > nums[i-1] + 1)
                ranges.push_back({ nums[i-1] + 1, nums[i] - 1 });
        
        ranges.push_back({ nums[nums.size()-1]+1, INT_MAX-1});

        int i = 0, k = 0;
        while(i < nums.size())
        {
            int j = i;
            while(j < nums.size() && nums[i] == nums[j])
                ++j;
            
            int numDuplicates = j - i - 1;

            while(numDuplicates > 0)
            {
                while(ranges[k][0] < nums[i])
                    ++k;
                
                int rangeBeg = ranges[k][0], rangeEnd = ranges[k][1];
                while(numDuplicates > 0 && rangeBeg <= rangeEnd)
                {
                    answer += (rangeBeg - nums[i]);
                    numDuplicates--, rangeBeg++;
                }
                if (rangeBeg <= rangeEnd)
                    ranges[k][0] = rangeBeg;
                else
                    ++k;
            }

            i = j;
        }

        return answer;
    }
};
80363