【LeetCode面试题17.04】消失的数字

【LeetCode面试题17.04】消失的数字

刷爆LeetCode系列

LeetCode面试题17.04:消失的数字

github地址

有梦想的电信狗

前言

本文用C++三种方法实现LeetCode面试题17.04:消失的数字

  • 方法一:数组哈希
  • 方法二:数学求和再相减
  • 方法三:位运算

题目描述

题目链接https://leetcode.cn/problems/missing-number-lcci/description/

在这里插入图片描述

题目与思路分析

目标分析

  1. 数组nums包含从0n的所有整数,但其中缺了一个。编写代码找出那个缺失的数字
  2. 要求时间复杂度至多为O(n)

思路一:数组哈希

思想

  • 题目给出一个长度为 n 的数组,元素取值范围为 0 ~ n,且恰好缺失一个数
  • 新建一个长度为 n + 1 的辅助数组 v,下标表示数字本身,值表示是否出现过。
  • 遍历原数组,将出现过的数字对应位置标记为 1
  • 再遍历辅助数组,第一个为 0 的下标就是缺失的数字

注意事项

  • 辅助数组长度必须是 nums.size() + 1,否则无法覆盖 n
  • 访问 v[nums[i]] 前要保证 nums[i] 一定在 0 ~ n 范围内。
  • 时间复杂度为 O(n),空间复杂度为 O(n)

思路二:数学求和

思想

  • 如果 0 ~ n 没有缺失,总和应为:
    t o t a l = n ( n + 1 ) 2 total = \frac{n(n+1)}{2} total=2n(n+1)​
  • 实际数组的元素之和记为 sum
  • 由于只缺失一个数,那么
    m i s s i n g = S − s u m missing = S - sum missing=S−sum
  • 一次遍历即可算出答案。

注意事项

  • n = nums.size(),而不是数组中最大值。
  • 使用 int 时要注意是否可能溢出(本题数据范围安全)。
  • 时间复杂度 O(n),空间复杂度 O(1)

思路三:位运算(异或)

思想

  • 异或的性质:
    • a ^ a = 0
    • a ^ 0 = a
  • 数组中包含 0 ~ n 缺一个数,共 n 个数。
  • 将数组中所有元素互相异或,再将 0 ~ n 全部互相异或:
    • 出现两次的数字会互相抵消为 0
    • 只出现一次的那个数字(缺失值)会被保留下来
  • 最终的异或结果就是缺失的数。

注意事项

  • 第二个循环必须遍历 0 ~ n(即 i <= nums.size())。
  • 异或不会产生溢出问题,适合大范围整数。
  • 时间复杂度 O(n),空间复杂度 O(1)

代码实现

思路一:数组哈希

// 数组哈希classSolution{public:intmissingNumber(vector<int>& nums){// 0-n 共 n+1 个数,缺了一个,还剩 n 个// 开一个大小为n+1 的数组,初始化值均为0// 遍历 这n个数,将其对应下标的位置标记为 1// 再遍历这个数组,值为0的位置的下标,就是缺失的数 vector<int>v(nums.size()+1,0);for(auto e:nums){ v[e]=1;}int i =0;for(;i< v.size();++i){if(v[i]==0)break;}return i;}};

思路二:数学求和

// 求和classSolution{public:intmissingNumber(vector<int>& nums){// 0-n 这些数 正确的和 为 totalint total = nums.size()*(nums.size()+1)/2;int sum =0;// 缺了一个数后的和 为 sumfor(auto e:nums) sum += e;return total - sum;// 相差的值 即为 缺失的数字}};

思路三:位运算

// 位运算classSolution{public:intmissingNumber(vector<int>& nums){// 数组中有 0-n 缺了一个,共 n 个数,再在后面添加 0 - n 这完全不缺 的 n + 1 个数// 则共有 2n+1 个数 2n+1个数中,消失的数只出现了一次// 其他数,每个数都出现了两次// 一个数 和0 异或 等于它本身 一个数 和 它本身异或 等于 0int res =0;for(int i =0;i<nums.size();++i) res ^= nums[i];for(int i =0;i<=nums.size();++i) res ^= i;return res;}};

算法代码优化

  • 可以选择使用STL自带的哈希容器优化,但非必须
  • 其他方法无需优化
classSolution{public:intmissingNumber(vector<int>& nums){ unordered_set<int> set;// 将这 n 个数 插入到 哈希setfor(auto e : nums){ set.insert(e);}int missing =-1;// 再遍历数字 0-n 那个数字没有出现,就是缺失的数字for(int i =0; i <= nums.size(); i++){if(set.count(i)==0){ missing = i;break;}}return missing;}};

结语

以上就是本文的所有内容了,如果觉得文章对你有帮助,欢迎 点赞⭐收藏 支持!如有疑问或建议,请在评论区留言交流,我们一起进步

分享到此结束啦
一键三连,好运连连!
你的每一次互动,都是对作者最大的鼓励!征程尚未结束,让我们在广阔的世界里继续前行! 🚀

Read more

从vw/vh到clamp(),前端响应式设计的痛点与进化

从vw/vh到clamp(),前端响应式设计的痛点与进化

目录 从vw/vh到clamp(),前端响应式设计的痛点与进化 一、原生响应式设计的痛点 1、使用 vw/vh/% 的蜜月期与矛盾点 2、以 px+@media 为主轴实现多端样式兼容 二、clamp():响应式设计的新思路 1、clamp() 是什么? 2、优势分析 三、实际应用场景示例 1、标题文字大小 2、布局容器宽度 3、按钮与间距 4、配合calc()实现更灵活布局 四、clamp() 的局限与思考 五、结语 从vw/vh到clamp(),前端响应式设计的痛点与进化 一、原生响应式设计的痛点 1、使用 vw/vh/% 的蜜月期与矛盾点

By Ne0inhk

Flutter 三方库 jwt_io 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、全能的 JSON Web Token (JWT) 加解密与身份安全验证引擎

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 jwt_io 的鸿蒙化适配指南 - 在鸿蒙系统上构建极致、严谨、全能的 JSON Web Token (JWT) 加解密与身份安全验证引擎 在鸿蒙(OpenHarmony)系统的端云一体化登录、政企应用的安全审计或复杂的跨端权限校验场景中,如何确保来自云端授信中心的 JWT Token 既能被正确解析(Decode),又能被严密地校验其合法性与过期时间?jwt_io 为开发者提供了一套工业级的、基于 RFC 7519 标准的 JSON Web Token 深度处理方案。本文将深入实战其在鸿蒙应用安全底座中的应用。 前言 什么是 JWT IO?它不仅是一个简单的 Base64 解码器,而是一个具备深厚 RFC

By Ne0inhk
分享一个开箱即用的 React K 线图组件,前端炒股看盘必备

分享一个开箱即用的 React K 线图组件,前端炒股看盘必备

一个 prop 画出专业 K 线图,数据获取和指标计算全自动。 为什么又造了个轮子 先说结论:不是我想造,是被逼的。 需求很简单 —— 在一个 React 项目里加一个股票 K 线图,要能切周期、看指标、支持缩放拖拽。听起来是不是很基础? 然后我开始找现成方案。TradingView 的 Lightweight Charts 不错,但免费版功能有限,而且它不是 React 组件,得自己封装一层。npm 上搜 “react kline” 或者 “react candlestick”,出来的结果要么年久失修,要么只是个 demo 级别的东西,拿来用还不如自己写。 既然找不到趁手的,那就自己搞一个。顺便把它做得通用一点,发出来给大家省点时间。 长什么样 项目名叫 kline-charts-react,

By Ne0inhk
回看经典!第十三章 C语言数据结构与算法基础:文件操作、排序查找实现及链表简介(2015年C语言培训班笔记重读)

回看经典!第十三章 C语言数据结构与算法基础:文件操作、排序查找实现及链表简介(2015年C语言培训班笔记重读)

目录 第十三章 基础数据结构 第1课:复习文件操作 第2课:冒泡排序与选择排序 第3课:二分查找算法 第4课:用递归实现二分查找 第5课:单向链表的实现         本文汇总了C语言在数据结构入门阶段的多个核心主题。包括文件操作(fopen、读写、指针)、基础排序算法(冒泡、选择)与查找算法(顺序、二分查找及其递归实现)的原理与代码实现,并简要介绍了单向链表的存储特点。通过对比和多个代码示例,为理解更复杂的数据结构与算法打下坚实基础。 第十三章 基础数据结构 第1课:复习文件操作 fopen函数的参数中,没有写具体路径,则表示在程序运行的当前目录下(相对路径);写了具体路径就是绝对路径。 文件结尾标识符EOF的使用 案例1:用feof判断读取下面文件中一个个字符: 代码: int main(){        FILE *p=fopen("d:\\c1\\gcc\

By Ne0inhk