LC每日一题 | 20240408 - 2009. 使数组连续的最少操作数

72 阅读1分钟

LC每日一题 | 20240408 - 2009. 使数组连续的最少操作数

给你一个整数数组 nums 。每一次操作中,你可以将 nums 中 任意 一个元素替换成 任意 整数。

如果 nums 满足以下条件,那么它是 连续的 :

  • nums 中所有元素都是 互不相同 的。
  • nums 中 最大 元素与 最小 元素的差等于 nums.length - 1 。

比方说,nums = [4, 2, 5, 3] 是 连续的 ,但是 nums = [1, 2, 3, 5, 6] 不是连续的 。

请你返回使 nums 连续 的 最少 操作次数。

提示:

  • 1 <= nums.length <= 10^5
  • 1 <= nums[i] <= 10^9

题目等级:Hard

虽然是个Hard,但是思路还是很简单的。

首先去重,题目中可没说没有重复的元素,只说了目标是没有重复,所以重复的数字一定是需要替换的。它们没有存在的意义。

然后常规操作,排个序。

下一步直接滑窗就行了。我们假定当前节点是目标序列中的最小值,加上 nums.size - 1 计算出整个序列的最大值,然后扫一下原始序列中有多少个元素是在这个区间之内的,维护一个最大值,最后用 nums.size - 1 减一下就可以了。

class Solution {
    fun minOperations(nums: IntArray): Int {
        val set = nums.toSet()
        val candidate = set.toMutableList()
        candidate.sort()
        var max = 0
        var cur = 0
        for (i in candidate.indices) {
            val target = candidate[i] + nums.size - 1
            var j = cur + i
            while (j < candidate.size && candidate[j] <= target) j++
            cur = j - i - 1
            max = Math.max(cur, max)
        }
        return nums.size - 1 - max
    }
}