为了找出无序整数数组中最小和最大数之间缺失的数字,我们首先需要确定最小和最大的数字。这可以通过遍历数组一次来实现,时间复杂度为O(n),其中n是数组的长度。
一旦我们有了最小和最大的数字,我们可以检查它们之间的所有数字是否都存在于数组中。但是,如果直接遍历检查每个数字,时间复杂度可能会很高,特别是当最大和最小数字之间的差距很大时。
为了优化这个过程,我们可以使用一个额外的数据结构,如哈希集合(HashSet),来存储数组中的所有数字。这样,检查一个数字是否存在于数组中就可以在平均情况下以O(1)的时间复杂度完成。
以下是一个使用JavaScript实现的示例:
function findMissingNumbers(arr) {
if (arr.length === 0) return [];
// 使用 Set 数据结构存储数组中的所有数字
const numSet = new Set(arr);
// 找出数组中的最小和最大数字
let min = Math.min(...arr);
let max = Math.max(...arr);
// 存储缺失的数字
const missing = [];
// 检查最小和最大数字之间的每个数字
for (let i = min; i <= max; i++) {
// 如果数字不在 Set 中,则它是缺失的
if (!numSet.has(i)) {
missing.push(i);
}
}
return missing;
}
// 示例用法
const arr = [4, 2, 9, 7, 5, 1];
const missingNumbers = findMissingNumbers(arr);
console.log(missingNumbers); // 输出: [3, 6, 8]
在这个示例中,我们首先使用Math.min
和Math.max
函数找出数组中的最小和最大数字。然后,我们使用一个for
循环遍历从最小到最大的每个数字,并使用Set
的has
方法来检查每个数字是否存在于数组中。如果数字不存在于数组中,我们将其添加到missing
数组中。最后,我们返回missing
数组,它包含所有缺失的数字。
虽然这个解决方案使用了额外的空间来存储数组中的所有数字,但它可以在O(n)的时间复杂度内找出所有缺失的数字,其中n是数组的长度。这是因为遍历数组和检查每个数字是否存在于Set
中都可以在O(n)的时间内完成。