Every day a leetcode
题目来源:448. 找到所有数组中消失的数字
解法1:STL set
set 是一个集合类型的容器,里面的元素具有唯一性,并且所有元素都会根据元素的键值自动被排序,以红黑树为底层数据结构。
我们使用集合set记录nums数组的元素,再遍历set找出找到所有的数组nums中消失的数字。
代码:
/*
* @lc app=leetcode.cn id=448 lang=cpp
*
* [448] 找到所有数组中消失的数字
*/
// @lc code=start
class Solution
{
public:
vector<int> findDisappearedNumbers(vector<int> &nums)
{
int n = nums.size();
set<int> s;
vector<int> ans;
for (int i = 0; i < n; i++)
s.insert(nums[i]);
for (int i = 1; i <= n; i++)
if (s.find(i) == s.end())
ans.push_back(i);
return ans;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中n为数组nums的元素个数。
空间复杂度:O(n),其中n为数组nums的元素个数。
解法2:原地修改
由于nums 的数字范围均在 [1,n] 中,我们可以利用这一范围之外的数字,来表达「是否存在」的含义。
具体来说,遍历 nums,每遇到一个数 x,就让 nums[x−1] 增加 n。由于 nums 中所有数均在 [1,n] 中,增加以后,这些数必然大于 n。最后我们遍历 nums,若 nums[i] 未大于 n,就说明没有遇到过数 i+1。这样我们就找到了缺失的数字。
注意,当我们遍历到某个位置时,其中的数可能已经被增加过,因此需要对 n 取模来还原出它本来的值。
代码:
/*
* @lc app=leetcode.cn id=448 lang=cpp
*
* [448] 找到所有数组中消失的数字
*/
// @lc code=start
// class Solution
// {
// public:
// vector<int> findDisappearedNumbers(vector<int> &nums)
// {
// int n = nums.size();
// set<int> s;
// vector<int> ans;
// for (int i = 0; i < n; i++)
// s.insert(nums[i]);
// for (int i = 1; i <= n; i++)
// if (s.find(i) == s.end())
// ans.push_back(i);
// return ans;
// }
// };
class Solution
{
public:
vector<int> findDisappearedNumbers(vector<int> &nums)
{
int n = nums.size();
for (auto &num : nums)
{
int x = (num - 1) % n;
nums[x] += n;
}
vector<int> ret;
for (int i = 0; i < n; i++)
{
if (nums[i] <= n)
{
ret.push_back(i + 1);
}
}
return ret;
}
};
// @lc code=end
结果:
复杂度分析:
时间复杂度:O(n),其中 n 是数组 nums 的长度。
空间复杂度:O(1)。