跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

LeetCode 2009.使数组连续的最少操作数怎么做?

大家好,我是顺亿。今天我们来聊聊 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)。

相关文章