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

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

时间:2025-01-22 09:20:23浏览次数:1  
标签:arr 数字 最大数 复杂度 最小 数组 缺失

为了找出无序整数数组中最小和最大数之间缺失的数字,我们首先需要确定最小和最大的数字。这可以通过遍历数组一次来实现,时间复杂度为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)的时间内完成。

标签:arr,数字,最大数,复杂度,最小,数组,缺失
From: https://www.cnblogs.com/ai888/p/18685000

相关文章

  • 写一个方法实现“插入排序算法”,并解释下时间复杂度和空间复杂度
    插入排序是一种简单直观的排序算法,它的工作原理是通过构建有序序列,对于未排序数据,在已排序序列中从后向前扫描,找到相应位置并插入。插入排序在实现上,通常采用in-place排序(即只需用到O(1)的额外空间的排序),因而在从后向前扫描过程中,需要反复把已排序元素逐步向后挪位,为最新元素提供......
  • 最小生成树Prim
    该算法的基本思想是从一个结点开始,不断加点.每次要选择距离最小的一个结点,以及用新的边更新其他结点的距离。从任意一个结点开始,将结点分成两类:已加入的,未加入的。每次从未加入的结点中,找一个与已加入的结点之间边权最小值最小的结点然后将这个结点加入,并连上那条边权最小的边......
  • 使用贪心算法解决最小生成树问题
    大家好,我是V哥。今天跟大家聊一聊贪心算法问题,因为遇到这个面试题,问贪心算法解决最小生成树是怎么设计的,以及如何应用?好家伙,这面试官一上来就不按套路出牌,直接上难度,如果你遇到这样的问题,该怎么办呢。下面V哥来详细聊一聊。贪心算法解决最小生成树问题的一般步骤一、解决思......
  • 以太网帧的最小长度和最大长度
    以太网帧的长度范围是有明确规定的。以太网帧的最小长度是64字节,最大长度是1518字节。‌最小长度‌:64字节。这个长度包括了14字节的帧头(目的MAC地址6字节、源MAC地址6字节、类型/长度字段2字节)、46字节的有效载荷(数据部分)和4字节的帧校验序列(FCS)。以太网帧之所以设置最小长度,是......
  • 在传统以太网中,为什么要有最小帧长度和最大帧长度的限制?(转)
    在传统以太网中,为什么要有最小帧长度和最大帧长度的限制?以太网(IEEE802.3)帧格式:1、前导码:7字节0x55,一串1、0间隔,用于信号同步2、帧起始定界符:1字节0xD5(10101011),表示一帧开始3、DA(目的MAC):6字节4、SA(源MAC):6字节5、类型/长度:2字节,0~1500保留为长度域值,1536~65535保留......
  • Java中的算法优化与复杂度分析
    1.算法优化的重要性在Java开发中,算法优化至关重要。高效的算法不仅可以提升程序运行速度,还能降低资源消耗,改善用户体验。优化算法需要综合考虑时间复杂度和空间复杂度,以找到最佳的解决方案。2.时间复杂度时间复杂度表示算法运行时间随输入规模变化的增长率。常见的时间复杂度......
  • 2025寒假哈工大ACM集训_最小生成树
    好不容易终于做完了,(最后一题是黑题并且还是数学不想做)所谓“做了不总结==没做”,特此写一下常用函数和思路吧。一些基本模板函数:longlongfindroot(longlongx){returnx==rt[x]?x:rt[x]=findroot(rt[x]);}voidun(longlongx,longlongy){rt[findro......
  • 文件格式分析 --- 最小class
    class是java编译后的可执行的字节码文件。下面是javapackagecom.example;publicclassHelloWorld{publicstaticvoidmain(String[]args){System.out.println("HelloWorldbygk");}} 编译后的二进制  用ida反汇编;+-----------------......
  • 2025dsfz集训Day5:最短路与最小生成树
    DAY5I:最小生成树生成树及最小生成树生成树是从一张无向连通图中选取一些边构成一张新图,使得这张图是是一棵树最小生成树即是让上述的生成树的边权和最小同时,最小生成树也会有一些性质在最小生成树上,两个点路径上经过的边权最小值即是这个点在原图中所有路径中可能经过......
  • python-leetcode-最小覆盖子串
    76.最小覆盖子串-力扣(LeetCode)classSolution:defminWindow(self,s:str,t:str)->str:ifnotsornott:return""need={}forcint:need[c]=need.get(c,0)+1windo......