从一个无序的整数数组中,找出最小和最大数之间缺失的数字,要求最小的时间复杂度

为了找出无序整数数组中最小和最大数之间缺失的数字,我们首先需要确定最小和最大的数字。这可以通过遍历数组一次来实现,时间复杂度为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.minMath.max函数找出数组中的最小和最大数字。然后,我们使用一个for循环遍历从最小到最大的每个数字,并使用Sethas方法来检查每个数字是否存在于数组中。如果数字不存在于数组中,我们将其添加到missing数组中。最后,我们返回missing数组,它包含所有缺失的数字。

虽然这个解决方案使用了额外的空间来存储数组中的所有数字,但它可以在O(n)的时间复杂度内找出所有缺失的数字,其中n是数组的长度。这是因为遍历数组和检查每个数字是否存在于Set中都可以在O(n)的时间内完成。

posted @   王铁柱6  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
点击右上角即可分享
微信分享提示