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:位运算
详情见于官方题解丢失的数字。