备战秋招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++代码

cpp 复制代码
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代码

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 代码

python 复制代码
class Solution:
    def missingNumber(self, nums: List[int]) -> int:
        nums_len = len(nums)
        res = nums_len
        for 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++代码

cpp 复制代码
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代码

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代码

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

复杂度分析

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

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

相关推荐
玩电脑的辣条哥24 分钟前
一台服务器已经有个python3.11版本了,如何手动安装 Python 3.10,两个版本共存
服务器·python·python3.11
wqfhenanxc24 分钟前
Mixing C++ and Rust for Fun and Profit 阅读笔记
c++·笔记·rust
R-G-B27 分钟前
【MFC】 VS2022打开低版本的MFC,双击.rc文件,DIalog加载失败,页面弹窗fatal error RC***:cannot open*****
c++·mfc·vs打开较早版本mfc·双击.rc文件·dialog加载失败·fatal error rc·cannot open
敲上瘾29 分钟前
基于Tcp协议的应用层协议定制
linux·运维·服务器·网络·c++·网络协议·tcp/ip
weixin_3077791330 分钟前
PySpark实现ABC_manage_channel逻辑
开发语言·python·spark
莹莹学编程—成长记1 小时前
string的模拟实现
服务器·c++·算法
lybugproducer1 小时前
创建型设计模式之:简单工厂模式、工厂方法模式、抽象工厂模式、建造者模式和原型模式
java·设计模式·建造者模式·简单工厂模式·工厂方法模式·抽象工厂模式·面向对象
海天一色y1 小时前
Pycharm(十六)面向对象进阶
ide·python·pycharm
??? Meggie1 小时前
【Python】保持Selenium稳定爬取的方法(防检测策略)
开发语言·python·selenium
南客先生1 小时前
马架构的Netty、MQTT、CoAP面试之旅
java·mqtt·面试·netty·coap