Every day a leetcode
题目来源:268. 丢失的数字
解法1:排序
代码:
/*
 * @lc app=leetcode.cn id=268 lang=cpp
 *
 * [268] 丢失的数字
 */
// @lc code=start
class Solution
{
public:
    int missingNumber(vector<int> &nums)
    {
        int n = nums.size();
        sort(nums.begin(), nums.end());
        for (int i = 0; i < n; i++)
            if (nums[i] != i)
                return i;
        return n;
    }
};
// @lc code=end
结果:

复杂度分析:
时间复杂度:O(n logn),其中 n 是数组 nums 的长度。排序的时间复杂度是O(n logn),遍历的的时间复杂度是O(n),故总的时间复杂度是O(n logn)。
空间复杂度:O(logn),其中 n 是数组 nums 的长度。空间复杂度主要取决于排序的递归调用栈空间。
解法2:哈希
哈希集合的每次添加元素和查找元素的时间复杂度都是O(1)。
使用哈希集合,可以将时间复杂度降低到O(n)。
代码:
class Solution
{
public:
    int missingNumber(vector<int> &nums)
    {
        unordered_set<int> uset;
        int n = nums.size();
        for (int i = 0; i < n; i++)
            uset.insert(nums[i]);
        for (int i = 0; i < n; i++)
            if(!uset.count(i))
                return i;
        return n;
    }
};
结果:

复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(n),其中 n 是数组 nums 的长度。
解法3:数学
提示0 <= nums[i] <= n,我们知道答案就是[0, n]中的一个数。
0+1+…+n=n(n+1)/2,减去数组nums的总和,就是我们要的答案。
代码:
class Solution
{
public:
    int missingNumber(vector<int> &nums)
    {
        int n = nums.size();
        return n * (n + 1) / 2 - accumulate(nums.begin(), nums.end(), 0);
    }
};
运行结果:

复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。
解法4:位运算
详情见于官方题解丢失的数字。




![[oeasy]python0048_注释_comment_设置默认编码格式](https://img-blog.csdnimg.cn/img_convert/0dbeb554a0180969f21851440d52e6ff.png)








![[230506] 2021年托福阅读真题第6篇|Water and Life on Mars|15:30~16:30|16:30~19:19](https://img-blog.csdnimg.cn/61623fe9e3624e30938fc8758f415e18.png)





