【算法 | 位运算No.1】leetcode268. 丢失的数字

个人主页:兜里有颗棉花糖

欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创

收录于专栏【手撕算法系列专栏】【Leetcode

🍔本专栏旨在提高自己算法能力的同时,记录一下自己的学习过程,希望对大家有所帮助

🍓希望我们一起努力、成长,共同进步。

点击直接跳转到该题目

目录

1️⃣题目描述

给定一个包含 [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 = [0,1]

输出:2

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

示例4:

输入:nums = [0]

输出:1

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

注意:

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

2️⃣题目解析

总共有三种解法(哈希、位运算、高斯求和)。

这里只对位运算高斯求和进行解释。

位运算求解原理:

  • 相同数组进行异或结果为0
  • 0 ^ num = num

高斯求和原理:

  • 把[0,n]的和记为sum1
  • 把数组nums中所有的元素之和记为sum2
  • 丢失的数字即为sum1 - sum2

3️⃣解题代码

解法1(高斯求和):

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size(),sum1 = 0,sum2 = 0;

        for(int i = 0;i < n;i++) sum1 += nums[i];
        for(int i = 0;i <= n;i++) sum2 += i;

        return sum2 - sum1;   
    }
};

解法2(位运算):

cpp 复制代码
class Solution {
public:
    int missingNumber(vector<int>& nums) {
        int n = nums.size(),ret = 0;
        for(auto x : nums) ret ^= x;
        for(int i = 0;i <= n;i++) ret ^= i;
        return ret;
    }
};
相关推荐
金古圣人1 天前
hot100 子串
数据结构·c++·算法·leetcode
LQ深蹲不写BUG1 天前
深挖三色标记算法的底层原理
java·算法
BlackPercy1 天前
【图论】Graphs.jl 最小生成树算法文档
算法·图论
THMAIL1 天前
机器学习从入门到精通 - Python环境搭建与Jupyter魔法:机器学习起航必备
linux·人工智能·python·算法·机器学习·docker·逻辑回归
悟能不能悟1 天前
快速排序算法详解
数据结构·算法·排序算法
jiaway1 天前
【C语言】第二课 位运算
c语言·开发语言·算法
Q741_1471 天前
C++ 面试高频考点 力扣 153. 寻找旋转排序数组中的最小值 二分查找 题解 每日一题
c++·算法·leetcode·面试·二分查找
麦格芬2301 天前
LeetCode 994 腐烂的橘子
算法·leetcode·职场和发展
mit6.8241 天前
[re_3]
c++·算法
LDG_AGI1 天前
【推荐系统】推荐召回算法(一):双塔召回模型训练与推理(Dual Tower Model and Faiss Retrieval)
算法