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^51 <= 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
}
}