一、题目链接
二、题目要求
给定一个包含
[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 = [9,6,4,2,3,5,7,0,1]
**输出:**8
解释:
n = 9,因为有 9 个数字,所以所有的数字都在范围[0,9]内。8 是丢失的数字,因为它没有出现在nums中。
三、解决
1.解法一
暴力解法:数组是缺失[0,n]中的一个数,所以我们先将数组按顺序排好,然后遍历一遍数组就能找到缺失的那个数字了
时间复杂度不推荐。
cpp
class Solution {
public:
int missingNumber(vector<int>& nums) {
sort(nums.begin(),nums.end());
for(int i = 0; i < nums.size(); i++)
{
if(nums[i] != i)
return i;
}
return nums.size();
}
};
2.解法二
哈希表:创建一个长度位n+1的数组,这个数组下标就是[0,n],然后遍历原数组,遍历到哪个数就在哈希表的对应下标的值加一,然后再遍历哈希表,哈希表中的值为0的下标就是丢失的数字。
cpp
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n = nums.size();
vector<int> arr(n+1,0);
for(int i = 0; i < n; i++)
{
arr[nums[i]]++;
}
for(int i = 0; i < n+1; i++)
{
if(arr[i] == 0)
return i;
}
return n;
}
};
3.解法三
高斯求和:先求出[0,n]的和,再求出该数组中所有数字的和。用总和减去数组中的和,剩下的就是丢掉的数字。
cpp
class Solution {
public:
int missingNumber(vector<int>& nums) {
int numsSum = 0;
int Sum = 0;
for(int i = 0; i < nums.size()+1; i++)
Sum+=i;
for(auto e : nums)
numsSum+=e;
return Sum-numsSum;
}
};
4.解法四
位运算:由
①a ^ 0 = a
②a ^ a = 0
③a ^ b ^ c = a ^ (b ^ c)交换律
可以得出解决方法:
创建一个[0,n]的tmp数组,先将原数组中的数字全部异或在一起,然后再将tmp中的数字全部异或在一起,然后让两次异或的结果相互异或,最后就只剩下一个丢失的数字了。
cpp
class Solution {
public:
int missingNumber(vector<int>& nums) {
int tmp1 = 0;
int tmp2 = 0;
for(int i = 0; i<nums.size()+1; i++)
tmp1^=i;
for(auto e:nums)
tmp2^=e;
return tmp1^=tmp2;
}
};
总结:很简单的一道题,但是解法很多,可以帮助初学者入门,这几种方法最好全部掌握。
