码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【数据结构练习题】消失的数字 --- 三种解法超详解


    图片来源于网络

    ✨博客主页:小钱编程成长记
    🎈博客专栏:数据结构练习题
    🎈相关博文:添加逗号

    消失的数字

    • 1. 🎈题目
    • 2. 🎈解题思路
      • ✨方法一:先排序,再找缺失的值
      • ✨方法二:按位异或,找缺失的值
      • ✨方法三:相减,找缺失的值
    • 3.🎈具体代码
      • 方法一:
      • 方法二:
      • 方法三:
    • 🎇总结

    1. 🎈题目

    在这里插入图片描述
    力扣链接

    2. 🎈解题思路

    ✨方法一:先排序,再找缺失的值

    1.先用冒泡排序将数组排成有序的。
    在这里插入图片描述
    2.遍历每个元素,判断+1后是否等于后面一个元素。如果不等于,则+1后得到得数字就是缺失的数字。因为要遍历N(未知)次,所以O(N)
    》整体时间复杂度为最高阶项O(N^2)。

    ✨方法二:按位异或,找缺失的值

    对于整数a: a ^ a ==0;0 ^ a == a;(支持分配律)
    1.让0 ^ 数组中的每个数,再 ^ 数字1~n。在这个式子里,数组中未缺少的数会有两个,按位异或得0;缺少的只有一个,与0按位异或后就得出了这个缺少的数。
    》因为会进行N(未知)次 ^ 操作,所以时间复杂度为O(N)

    ✨方法三:相减,找缺失的值

    1.将1~n个数相加得到和sum
    2.用sum 减去数组中的元素,得到的就是数组中缺少的元素
    》因为出现了N(未知)次减元素的操作,所以时间复杂度为O(N)

    3.🎈具体代码

    方法一:

    //时间复杂度O(n^2)
    int missingNumber(int* nums, int numsSize) {
        //冒泡排序
        int i = 0;
        for (i = 0; i < numsSize - 1; ++i)
        {
            int j = 0;
            for (j = 0; j < numsSize - 1 - i; ++j)
            {
                if (nums[j] > nums[j + 1])
                {
                    int tmp = nums[j];
                    nums[j] = nums[j + 1];
                    nums[j + 1] = tmp;
                }
    
            }
        }
    
        //判断前面的数+1是否 == 后面的数
        for (i = 0; i < numsSize - 1; ++i)//比较numsSize-1次,判断前面的数+1是否 == 后面的数
        {
            if (0 != nums[0])//如果第一个数不是0,则说明缺少0
            {
                break;
            }
    
            if (nums[i] + 1 == nums[i + 1])//不严谨,第1的数不是0时,条件也都成立
            {
                continue;
            }
    
            else
            {
                break;
            }
    
        }
    
        if (0 != nums[0])
        {
            return 0;
        }
        else
        {
            return nums[i] + 1;
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49

    方法二:

    //时间复杂度O(n)
    int missingNumber(int* nums, int numsSize) {
        //两个相同的数按位异或,得0; 0 ^ a == a
    	  //举例:0^1^2^1 == 2
        int x = 0;
        int i = 0;
        for (i = 0; i < numsSize; ++i)//0~n中少了一个数,所以共n个数
        {
            x ^= nums[i];
        }
        for (i = 0; i <= numsSize; ++i)//按位异或 从0 到 n的数
        {
            x ^= i;
        }
    
        return x;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    方法三:

    //时间复杂度O(n)
    int missingNumber(int* nums, int numsSize) {
        //计算0~n个数的和(等差数列,差为1)
        //0~n共 numsSize+1个数,所以n == numsSize
        int sum = (0 + numsSize) * (numsSize + 1) / 2;
    
        //计算nums中元素的和
        int i = 0;
        int sum2 = 0;
        for (i = 0; i < numsSize; ++i)
        {
            sum2 += nums[i];
        }
    
        return sum - sum2;
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    🎇总结

    本篇文章我们用三种方法,逐渐减少时间复杂度,解决了力扣上消失的数字这道题,感谢大家的阅读!大家一起进步!

    点赞收藏加关注,C语言学习不迷路!
    图片来源于网络

  • 相关阅读:
    神经网络模型压缩综述
    缺失值填充
    win11不兼容,咋办啊大家,我的世界下载16位不兼容我试了好多种办法不管用,希望有懂得,可以帮助一下
    kibana 导出es索引数据 和数据导入到索引
    iOS中的锁
    26、Stream流式计算,链式编程
    【java学习—七】对象的实例化过程(33)
    Double精度丢失问题排查及解决思路
    音频之Android NDK读写声卡
    ISO认证证书上常见的认可标志
  • 原文地址:https://blog.csdn.net/xue_bian_cheng_/article/details/134018525
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号