位运算(4)_丢失的数字

news2024/10/1 18:39:18

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

位运算(4)_丢失的数字

收录于专栏【经典算法练习】
本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

温馨提示:

1. 题目链接 :

2. 题目描述 :

3. 解法 :

    解法一(哈希表) :

    算法思路 :

    代码展示 :

    结果分析 :

    解法二(数学高斯求和) :

    算法思路 :

    代码展示 :

    结果分析 :

    解法三(位运算) :

    算法思路 :

    代码展示 :

    结果分析 :


温馨提示:

本文的算法题需要一些位运算知识的基础,如果大家还不是很了解的话,可以先去看下面的博客:
位运算(1)_常见位运算总结-CSDN博客

1. 题目链接 :

OJ链接: 丢失的数字

2. 题目描述 :

给定一个包含 [0, n] 中 n 个数的数组 nums ,找出 [0, n] 这个范围内没有出现在数组中的那个数。

示例 1:

输入:nums = [3,0,1]
输出:2
解释:n = 3,因为有 3 个数字,所以所有的数字都在范围 [0,3] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 2:

输入:nums = [0,1]
输出:2
解释:n = 2,因为有 2 个数字,所以所有的数字都在范围 [0,2] 内。2 是丢失的数字,因为它没有出现在 nums 中。

示例 3:

输入:nums = [9,6,4,2,3,5,7,0,1]
输出:8
解释:n = 9,因为有 9 个数字,所以所有的数字都在范围 [0,9] 内。8 是丢失的数字,因为它没有出现在 nums 中。

示例 4:

输入:nums = [0]
输出:1
解释:n = 1,因为有 1 个数字,所以所有的数字都在范围 [0,1] 内。1 是丢失的数字,因为它没有出现在 nums 中。

提示:

  • n == nums.length
  • 1 <= n <= 104
  • 0 <= nums[i] <= n
  • nums 中的所有数字都 独一无二

进阶:你能否实现线性时间复杂度、仅使用额外常数空间的算法解决此问题?

3. 解法 :

    解法一(哈希表) :

    算法思路 :

哈希表构建:

首先,定义一个哈希表 ret,用于记录数组 nums 中每个数字的出现次数。
遍历 nums 数组,对于每个数字 ch,将其在哈希表中的计数加一。这样,ret 中将存储每个数字及其出现的次数。
查找缺失的数字:

接下来,循环从 0 到 nums.size(),检查每个数字是否在哈希表 ret 中存在。这里的 nums.size() 是 n,意味着数组的数字范围是 0 到 n,因为我们期望有 n + 1 个数字(从 0 到 n)。
如果在哈希表中找不到某个数字(即 ret[i] 等于 0),则返回该数字 i,它就是缺失的数字。
返回结果:

如果所有数字都存在于哈希表中,函数会返回 0,尽管在这个特定问题中,这种情况是不可能发生的,因为问题的设定保证总会有一个缺失的数字。

    代码展示 :

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        unordered_map<int, int> ret;
        for(auto ch : nums)
            ret[ch]++;
        for(int i = 0; i <= nums.size(); i++)
            if(!ret[i]) return i;
        return 0;
    }
};

 

    结果分析 :

时间复杂度
这个算法的时间复杂度为O(n),因为我们分别遍历了一次数组来构建哈希表和一次来查找缺失的数字。
空间复杂度
空间复杂度为O(n),因为在最坏的情况下,我们可能需要存储数组中所有的数字在哈希表中。

尽管这个算法有效,但使用哈希表可能会浪费一些空间。可以考虑其他更优化的方法,例如使用数学公式或位运算来降低空间复杂度。

    解法二(数学高斯求和) :

    算法思路 :

计算理论总和:

对于一个长度为n 的数组,数字的范围是从0 到n(共n + 1 个数字)。理论上,这些数字的总和可以使用高斯求和公式计算:

total_sum = n * (n + 1) / 2
这里的n 是数组 nums 的大小,表示有n + 1 个数字,缺失一个数字。

通过遍历 nums 数组,将所有数字的值累加,并减去上述计算的理论总和。具体做法是初始化 ret 为 total_sum,然后遍历 nums 中的每个数字 ch,并从 ret 中减去 ch 的值。
返回缺失的数字:

最后,ret 的值将是缺失的数字,因为所有存在的数字都已被减去,留下的就是缺失的数字。

    代码展示 :

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = nums.size() * (nums.size() + 1) / 2;
        for(auto ch : nums)
            ret -= ch;
        return ret;
    }
};

 

    结果分析 :

时间复杂度
O(n),因为需要遍历整个数组一次。
空间复杂度:
O(1),因为只使用了有限的额外空间,不随输入规模增加而增加。
优点
这个方法避免了使用额外的数据结构(如哈希表),使得空间复杂度降低,性能更优,尤其在处理大规模输入时表现更好。

    解法三(位运算) :

    算法思路 :

设数组的大小为n,那么缺失之前的数就是[0,n],数组中是在[0,n]中缺失一个数形成的序列.

如果我们把数组中所有数,以及[0,n]中的所有数全部[异或]在一起,那么根据[异或]运算的[消消乐]规律,最终的异或结果应该是缺失的数~

    代码展示 :

class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int ret = 0;
        for(int i = 0; i <= nums.size(); i++)
            ret ^= i;

        for(auto ch : nums)
            ret ^= ch;
        return ret;
    }
};

    结果分析 :

时间复杂度:
O(n),因为我们遍历了数组两次(一次计算完整范围的异或值,一次计算实际数组的异或值)。
空间复杂度:
O(1),因为只使用了有限的额外空间来存储 ret。
优点
这个方法是高效且简洁的,利用异或的性质避免了使用额外的数据结构,特别适合于这个类型的问题。
由于位运算速度非常快,这种方法在处理大规模数据时非常高效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2182925.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

学习VTK的目的和方法

1 VTK&#xff08;Visualization Toolkit&#xff09;是一个开源的跨平台软件系统&#xff0c;用于三维计算机图形学、图像处理和可视化。学习VTK的主要目的有&#xff1a; 3D可视化&#xff1a; VTK提供了丰富的工具和算法&#xff0c;可以用来可视化各种科学数据&#xff0c…

VBA数据库解决方案第十五讲:Recordset集合中单个数据的精确处理

《VBA数据库解决方案》教程&#xff08;版权10090845&#xff09;是我推出的第二套教程&#xff0c;目前已经是第二版修订了。这套教程定位于中级&#xff0c;是学完字典后的另一个专题讲解。数据库是数据处理的利器&#xff0c;教程中详细介绍了利用ADO连接ACCDB和EXCEL的方法…

windows下安装nginx和基本配置

1. 下载 Nginx 从 Nginx 官方网站下载 Windows 版本的 Nginx。访问 Nginx 官网 并选择适合 Windows 的版本。通常应选择稳定版&#xff08;Stable version&#xff09; 2. 安装 Nginx 安装 Nginx 实际上是解压下载的文件。可以选择一个适合的位置来存放 Nginx 的文件夹 例如…

【数据结构初阶】排序算法(下)冒泡排序与归并排序

文章目录 4. 交换排序4. 1 冒泡排序 5. 归并排序6. 非比较排序6. 1 计数排序 5. 排序性能分析6. 排序算法复杂度及稳定度分析 4. 交换排序 交换排序基本思想: 所谓交换**&#xff0c;就是根据序列中两个记录键值的比较结果来对换这两个记录在序列中的位置**。 交换排序的特点是…

下一代性能怪兽RTX 5090最新规格更新与Blackwell架构解析

据悉&#xff0c;目前各家AIC厂商已经陆续收到NVIDIA的相关资料&#xff0c;RTX 5090、RTX 5080已经正式进入开案阶段&#xff0c;也就是厂商们开始设计各自的产品方案了。不出意外&#xff0c;年初的CES 2025上会看到RTX 5090/5080的发布。 作为NVIDIA的新一代GPU&#xff0c…

2024年健康经济与大数据研讨会(HEBD 2024)2024 Seminar on Health Economics and Big Data

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 2024年经济决策与人工智能国际学术会议 &#xff08;EDAI 2024&#xff09;将在2024年11月08-10日在广东省广州市隆重举行。大会邀请来自国内外高等院校、科学研究所、企事业单位的专家、教授、学者、工程师…

理解互联网链路:从本地ISP到Tier 1 ISP运营商

1. 互联网服务提供商&#xff08;ISP&#xff09; 互联网服务提供商&#xff08;ISP&#xff09;是指提供互联网接入服务的公司或组织。它们负责将用户连接到互联网&#xff0c;并提供相关的服务&#xff0c;如电子邮件、网站托管和其他在线服务。ISP可以分为不同的层级&#…

告别转换顾虑,来试试这四款pdf转换器~

各位小伙伴们&#xff0c;大家好&#xff01;今天我来给大家分享几款超级好用的PDF转换工具&#xff0c;无论是工作还是学习&#xff0c;相信这些工具都会给你带来极大的便利&#xff1b;别看PDF文件看似难搞&#xff0c;其实有了这些神器&#xff0c;一切都变得轻松又愉快&…

在线css像素Px到百分比(%)换算器

具体请前往&#xff1a;在线Px转百分比(%)工具--将绝对像素(px)长度单位转换为相对父级元素内尺寸的相对长度单位百分比(%)

PCL GridMinimum获取栅格最低点

目录 一、概述 1.1原理 1.2实现步骤 1.3应用场景 二、代码实现 2.1关键函数 2.1.1 GridMinimum 栅格最低点提取 2.1.2 可视化函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接&#xff1a; PCL点云算法与项目实战案例汇总&#xff08;长…

新农人的求索:既要种菜,也要种钱

澎湃新闻记者 何惠子 灯下立着一个玻璃瓶&#xff0c;内里空无一物&#xff0c;清晰透亮。 一只手握住瓶身。“就像这个瓶子。前途一片光明&#xff0c;但其实都在瓶子里。” 解晓巍说的是音乐——他曾梦想以此维生。事实上&#xff0c;这也适合描述农业。 在没有任何收入的202…

计算机网络:计算机网络概述 —— 初识计算机网络

文章目录 计算机网络组成部分网络架构协议与标准网络设备网络类型作用实际应用案例 计算机网络 计算机网络是指将多台计算机通过通信设备和通信链路连接起来&#xff0c;以实现数据和信息的交换和共享的技术和系统。它是现代信息社会的基础设施之一&#xff0c;也是互联网的基…

工业现场干扰问题及处理方法

目前&#xff0c;各种干扰在各类工业现场中均存在&#xff0c;所以仪表及控制系统的可靠性直接影响到现代化工业生产装置安全、稳定运行&#xff0c;系统的抗干扰能力是关系到整个系统可靠运行的关键。随着DCS、现场总线技术的应用&#xff0c;被控对象和被测信号往往分布在各个…

Ubuntu启动后第一次需要很久才能启动GTK应用问题

Ubuntu启动后第一次需要很久才能启动GTK应用问题 自从升级了 Ubuntu 之后&#xff0c;设备重启&#xff0c;发现打开 Terminal 、Nautilus 以及其他的GTK 应用都很慢&#xff0c;需要至少一分钟的时间启动。 刚开始也是拿着 journalctl 的异常日志去寻找答案&#xff0c;但是没…

cheese安卓版纯本地离线文字识别插件

目的 cheese自动化平台是一款可以模拟鼠标和键盘操作的自动化工具。它可以帮助用户自动完成一些重复的、繁琐的任务&#xff0c;节省大量人工操作的时间。可以采用Vscode、IDEA编写&#xff0c;支持Java、Python、nodejs、GO、Rust、Lua。cheese也包含图色功能&#xff0c;识别…

山东大学操作系统学习笔记:第3.1讲程序的结构-简单的程序

第3.1讲&#xff1a;程序的结构-简单的程序 可执行文件 & 程序的装入 .rwdata(读写数据段): 存放程序中的含初值常量。这些常量在程序运行可以修改。 零初始化数据段&#xff08;.zidata/.bss - Block Started by Symbol&#xff09;&#xff1a;存放程序中的不含初值&am…

《自控原理》最小相位系统

在复平面右半平面既没有零点&#xff0c;也没有极点的系统&#xff0c;称为最小相位系统&#xff0c;其余均为非最小相位系统。 从知乎看了一篇答案&#xff1a; https://www.zhihu.com/question/24163919 证明过程大概率比较难&#xff0c;我翻了两本自控的教材&#xff0c;…

【中间件】fastDFS的相关知识

一、分布式文件系统 1.1 传统的文件系统 我们在Linux中学习的文件系统就是传统的文件系统&#xff1a; 传统的文件系统格式&#xff1a; ntfs/fat32/ext3/ext4 可以被挂载和卸载&#xff0c;就是一般一个盘可以分成多个盘&#xff0c;每一盘都可以挂载到不同的目录路径中。…

实时语音交互,打造更加智能便捷的应用

随着人工智能和自然语言处理技术的进步&#xff0c;用户对智能化和便捷化应用的需求不断增加。语音交互技术以其直观的语音指令&#xff0c;革新了传统的手动输入方式&#xff0c;简化了用户操作&#xff0c;让应用变得更加易用和高效。 通过语音交互&#xff0c;用户可以在不…

考研笔记之操作系统(三)- 存储管理

操作系统&#xff08;三&#xff09;- 存储管理 1. 内存的基础知识1.1 存储单元与内存地址1.2 按字节编址和按字编址1.3 指令1.4 物理地址和逻辑地址1.5 从写程序到程序运行1.6 链接1.6.1 静态链接1.6.2 装入时动态链接1.6.3 运行时动态链接 1.7 装入1.7.1 概念1.7.2 绝对装入1…