当前位置: 首页 > news >正文

备战秋招60天算法挑战,Day22

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

视频题解: https://www.bilibili.com/video/BV1HS42197Hc/

LeetCode 268.丢失的数字

题目描述

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

举个例子:

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

视频题解

丢失的数字

思路来源

思路来源

思路解析

方法一 位运算

首先来看一下异或运算的特点,11转成二进制101113转成二进制1101,它们之间的异或运算如下图:

11 ^ 13 = 611 ^ 11 = 0,可以看出,对于二进制相同的bit位按位异或值是0,比如1 ^ 1 = 00 ^ 0 = 0。不同值bit位按位异或值是1,比如1 ^ 0 = 1

利用异或运算符这个特性我们可以轻松解决这个题目。

对区间[0, n]和数组nums中所有的元素做异或运算,在nums中的元素会出现两次,不在nums中的元素只会出现一次,两个相同的元素做异或值为0,最后的结果就是不在nums中的元素。

比如n = 3nums = [3, 0, 1]0 ^ 1 ^ 2 ^ 3 ^ 3 ^ 0 ^ 1 = (0 ^ 0) ^ (1 ^ 1) ^ (3 ^ 3) ^ 2 = 0 ^ 2 = 2。最终2就是不在nums中的数字。

C++代码

class Solution {
public:int missingNumber(vector<int>& nums) {int nums_len = nums.size();int res = nums_len;for (int i = 0; i < nums_len; ++i) {//[0,n]和nums中的元素做异或操作res ^= (i ^ nums[i]); }return res;}
};

java代码

class Solution {public int missingNumber(int[] nums) {int nums_len = nums.length;int res = nums_len;for (int i = 0; i < nums_len; ++i) {//[0,n]和nums中的元素做异或操作res ^= (i ^ nums[i]);}return res;}
}

python 代码

class Solution:def missingNumber(self, nums: List[int]) -> int:nums_len = len(nums)res = nums_lenfor i in range(nums_len):#[0,n]和nums中的元素做异或操作res ^= (i ^ nums[i])return res

方法二 数学运算

因为区间[0, n]上有n + 1个元素,数组nums中只有n个元素,假设缺失的元素为X,我们可以得到如下公式:

0 + 1 +...+ n = nums[0] + nums[1] +...+ nums[n-1] + X 

我们只需要用区间[0, n]所有元素的和减去nums中所有元素的和就得到最终的结果X

C++代码

class Solution {
public:int missingNumber(vector<int>& nums) {int nums_len = nums.size();int res = nums_len;for (int i = 0; i < nums_len; ++i) {//[0,n]的和减去nums中所有元素的和res += (i - nums[i]); }return res;}
};

java代码

class Solution {public int missingNumber(int[] nums) {int nums_len = nums.length;int res = nums_len;for (int i = 0; i < nums_len; ++i) {//[0,n]的和减去nums中所有元素的和res += (i - nums[i]);}return res;}
}

python代码

class Solution:def missingNumber(self, nums: List[int]) -> int:nums_len = len(nums)res = nums_lenfor i in range(nums_len):#[0,n]的和减去nums中所有元素的和res += (i - nums[i])return res

复杂度分析

时间复杂度: 两种方法的整个过程都是只遍历了一遍数组,所以时间复杂度为O(n)n为数组nums的长度。

空间复杂度: 两种方法都只使用了几个整型变量,所以空间复杂度都是O(1)

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • I2C通信协议(软件I2C和硬件I2C)
  • 博客园-awescnb插件-geek皮肤优化--公众号卡片
  • Kerberos认证以及黄金票据白银票据的简单介绍
  • 【其它-高效处理小技巧】如何批量备份263企业邮箱邮件之-如何查看.eml
  • C语言程序设计-练习篇
  • 深度优先搜索-放苹果
  • Python OpenCV 影像处理:影像轮廓
  • 详细阐述Android中的四种启动模式
  • 项目问题 | CentOS 7停止维护导致yum失效的解决办法
  • 前端数据存在什么地方,刷新页面之后依旧存在
  • 【数学建模备赛】Ep05:斯皮尔曼spearman相关系数
  • 尚硅谷Java面试题第四季-MySQL面试题
  • 关于武汉芯景科技有限公司的多协议收发芯片XJ526(第二篇RS422模式)开发指南(兼容SP526)
  • Java:循环练习
  • 开发指南054-选择人员
  • 【391天】每日项目总结系列128(2018.03.03)
  • ES6简单总结(搭配简单的讲解和小案例)
  • java 多线程基础, 我觉得还是有必要看看的
  • Java新版本的开发已正式进入轨道,版本号18.3
  • Octave 入门
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • Vue UI框架库开发介绍
  • 闭包--闭包作用之保存(一)
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 浮动相关
  • 关于字符编码你应该知道的事情
  • 简单实现一个textarea自适应高度
  • 算法-插入排序
  • 为视图添加丝滑的水波纹
  • MiKTeX could not find the script engine ‘perl.exe‘ which is required to execute ‘latexmk‘.
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 我们雇佣了一只大猴子...
  • (3)(3.5) 遥测无线电区域条例
  • (C语言)二分查找 超详细
  • (Redis使用系列) SpringBoot 中对应2.0.x版本的Redis配置 一
  • (一)u-boot-nand.bin的下载
  • (转)Sublime Text3配置Lua运行环境
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • *算法训练(leetcode)第三十九天 | 115. 不同的子序列、583. 两个字符串的删除操作、72. 编辑距离
  • .net core 实现redis分片_基于 Redis 的分布式任务调度框架 earth-frost
  • .NET建议使用的大小写命名原则
  • .net开发引用程序集提示没有强名称的解决办法
  • .set 数据导入matlab,设置变量导入选项 - MATLAB setvaropts - MathWorks 中国
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • @Builder注释导致@RequestBody的前端json反序列化失败,HTTP400
  • @RequestParam,@RequestBody和@PathVariable 区别
  • [202209]mysql8.0 双主集群搭建 亲测可用
  • [2024] 十大免费电脑数据恢复软件——轻松恢复电脑上已删除文件
  • [AI]ChatGPT4 与 ChatGPT3.5 区别有多大
  • [Algorithm][综合训练][拜访][买卖股票的最好时机(四)]详细讲解
  • [BZOJ]4817: [Sdoi2017]树点涂色
  • [C/C++] -- 二叉树
  • [C++进阶]map和set的相关题目
  • [Cloud Networking] Layer 2