当前位置: 首页 > 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)

http://www.lryc.cn/news/430384.html

相关文章:

  • 在Linux下搭建go环境
  • 738.单调递增的数字
  • 近年国际重大网络安全事件深度剖析:安全之路任重道远
  • Windows C++控制台菜单库开发与源码展示
  • ARM——驱动——Linux启动流程和Linux启动
  • Docker和虚拟机的区别详细讲解
  • leetcode_68. 文本左右对齐
  • python探索分形和混沌
  • LeetCode77 组合
  • C#:Bitmap类使用方法—第1讲
  • PaddleNLP 3.0 支持大语言模型开发
  • 32次8.21(学习playbook-roles,脚本创建数据库和表,mycat读写分离)
  • I2C通信协议(软件I2C和硬件I2C)
  • Linux入门——08 进程间通讯——管道
  • 深入探讨SD NAND的SD模式与SPI模式初始化
  • 【jvm】栈和堆的区别
  • 智能的意义是降低世界的不确定性
  • python实现指数平滑法进行时间序列预测
  • linux文件——用户缓冲区——概念深度探索、IO模拟实现
  • Hive3:常用查询语句整理
  • Ubuntu下载安装教程|Ubuntu最新长期支持(LTS)版本24.04 LTS下载安装
  • 通知:《自然语言及语音处理设计开发工程师》即将开课!
  • Vim youcompleteme Windows 安装保姆级教程
  • 港迪技术IPO提交注册,拟募资6.56亿元
  • retinaface在ubuntu20.04(wsl2)下使用tensorrt(c++)部署
  • vue打包设置 自定义的NODE_ENV
  • python爬虫521
  • CSS中flex:1是什么属性
  • 网络硬件升级指南:提升性能的策略与实践
  • XSS-过滤特殊符号的正则绕过