大家好,我是顺亿。今天我们来聊聊 LeetCode 上的一个问题:2009. 使数组连续的最少操作数。这个问题其实挺有意思的,它要求我们通过修改数组中的元素,使得最终数组变成一个连续的整数序列,并且问我们最少需要修改多少个元素。
首先,我们要明确题目的核心思想。我们的目标是保留尽可能多的原始数字,并且这些数字能落在某个长度为 n 的连续区间内。所以,我们需要在排序、去重后的数组中,找一个长度为 n 的窗口,使得该窗口包含最多的原数组元素。
解题步骤
去重 + 排序
滑动窗口 or 二分查找
接下来,我们来看一下具体的代码实现。
set = new HashSet<>();
for (int num : nums) {
set.add(num);
}
List arr = new ArrayList(set);
Collections.sort(arr);
int m = arr.size();
int maxKeep = 1; // 至少能保留一个数
// Step 2: 对每个可能的起点,用二分找右边界
for (int i = 0; i < m; i++) {
int right = arr.get(i) + n - 1;
int j = binarySearch(arr, right);
// j 是第一个 > right 的索引,所以 [i, j-1] 都包含在 target 的索引
}
复杂度分析
时间复杂度:O(n log n)
空间复杂度:O(n)
示例验证
输入:nums = [4,2,5,3]
去重排序后:[2,3,4,5]
若起点=2,区间=[2,5],包含全部4个数 → 保留4个 → 操作数 = 0
输入:nums = [1,10,100,1000]
去重后:[1,10,100,1000]
任一起点的窗口最多包含1个数 → 操作数 = 4 - 1 = 3
总结
通过去重、排序和二分查找,我们可以高效地解决这个问题。其实,这个问题关键在于转换思路,不是直接构造连续数组,而是最大化保留原数组中能“塞进”某个长度为 n 的连续区间的不同元素个数。
如果你对这个问题还有疑问,或者想了解更多编程技巧,欢迎访问「趣航编程网」(www.vqhf.com)。
