<p>You are given an integer array <code>nums</code>. In one operation, you can replace <strong>any</strong> element in <code>nums</code> with <strong>any</strong> integer.</p>

<p><code>nums</code> is considered <strong>continuous</strong> if both of the following conditions are fulfilled:</p>

<ul>
	<li>All elements in <code>nums</code> are <strong>unique</strong>.</li>
	<li>The difference between the <strong>maximum</strong> element and the <strong>minimum</strong> element in <code>nums</code> equals <code>nums.length - 1</code>.</li>
</ul>

<p>For example, <code>nums = [4, 2, 5, 3]</code> is <strong>continuous</strong>, but <code>nums = [1, 2, 3, 5, 6]</code> is <strong>not continuous</strong>.</p>

<p>Return <em>the <strong>minimum</strong> number of operations to make </em><code>nums</code><em> </em><strong><em>continuous</em></strong>.</p>

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

<pre>
<strong>Input:</strong> nums = [4,2,5,3]
<strong>Output:</strong> 0
<strong>Explanation:</strong>&nbsp;nums is already continuous.
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,2,3,5,6]
<strong>Output:</strong> 1
<strong>Explanation:</strong>&nbsp;One possible solution is to change the last element to 4.
The resulting array is [1,2,3,5,4], which is continuous.
</pre>

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

<pre>
<strong>Input:</strong> nums = [1,10,100,1000]
<strong>Output:</strong> 3
<strong>Explanation:</strong>&nbsp;One possible solution is to:
- Change the second element to 2.
- Change the third element to 3.
- Change the fourth element to 4.
The resulting array is [1,2,3,4], which is continuous.
</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>1 &lt;= nums[i] &lt;= 10<sup>9</sup></code></li>
</ul>


void print(auto v)
{
    // cout << (#v) << ": ";
    for (auto ele : v)
        cout << ele << " ";
    cout << endl;
}

class Solution {
public:
    int minOperations(vector<int>& v) {
        int n = v.size();
        sort(v.begin(), v.end());
        vector<int> dist_cnt(n);
        int ans = n;

        int prev = -1;
        int counter = 0;

        for (int i=0; i<n; i++)
        {
            if (v[i] != prev)
                counter++;
            dist_cnt[i] = counter;
            prev = v[i];
        }

        print(v);
        print(dist_cnt);

        for (int i=0; i<n; i++)
        {
            int start = v[i];
            int end = start + n - 1;
            int ind = i;
            int l = i, r = n - 1;
            while (l <= r)
            {
                int mid = (l + r) / 2;
                if (v[mid] <= end)
                {
                    ind = mid;
                    l = mid + 1;
                }
                else 
                    r = mid - 1;
            }

            // 0 1 2 3 4
            int sub_arr_sz = ind - i + 1;
            int dup_cnt = sub_arr_sz - (dist_cnt[ind] - dist_cnt[i] + 1);
            int rem = n - sub_arr_sz + dup_cnt; 
            ans = min(ans, rem);
        }

        return ans;
    }
};

// 4 5 8 8 9 9 
75600