题目

给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。
如果 nums 满足以下条件,那么它是 连续的 :
nums 中所有元素都是 互不相同 的。
nums 中 最大 元素与 最小 元素的差等于 nums.length - 1 。
比方说,nums = [4, 2, 5, 3] 是 连续的 ,但是 nums = [1, 2, 3, 5, 6] 不是连续的 。
请你返回使 nums 连续 的 最少 操作次数。

示例

示例 1:
输入:nums = [4,2,5,3]
输出:0
解释:nums 已经是连续的了。
示例 2:
输入:nums = [1,2,3,5,6]
输出:1
解释:一个可能的解是将最后一个元素变为 4 。
结果数组为 [1,2,3,5,4] ,是连续数组。
示例 3:
输入:nums = [1,10,100,1000]
输出:3
解释:一个可能的解是:

代码

class Solution {
public:
    int minOperations(vector<int>& nums) {
        int n = nums.size();
        //利用set的性质对nums去重
        unordered_set<int> cnt(nums.begin(),nums.end());
        //把去重后的内容存入到vector容器中
        vector<int> sortedUniqueNums(cnt.begin(), cnt.end());
        //排序去重后的数组
        sort(sortedUniqueNums.begin(), sortedUniqueNums.end());
        int res = n,j = 0;//答案最大就是n(全部修改),j是滑动窗口的范围
        //遍历处理过后的数组
        for(int i = 0;i < sortedUniqueNums.size();i++)
        {
            //题目中定义了最大和最小的插值
            int right = sortedUniqueNums[i] + n - 1;
            while(j < sortedUniqueNums.size() && sortedUniqueNums[j] <= right)
            {
                //n-(j-i+1)理解为n里减去满足左右区间条件的数 剩下的 就是要修改的数
                res = min(res,n - (j - i + 1));j++;
            }
        }
        return res;
    }
};