目录
题目描述
给定一个包含
[0, n]
中n
个数的数组nums
,找出[0, n]
这个范围内没有出现在数组中的那个数。
n == nums.length
1 <= n <= 104
0 <= nums[i] <= n
nums
中的所有数字都 独一无二
方法一:排序
1.思想
1.先将整个数组进行排序
2.定义i的值从0-n,
3.一个for()循环,如果nums[i]!=i,则代表这个i的值丢失了
4.return i;
2.代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
// assert(nums);
// int n=sizeof(nums)/sizeof(nums[0]);
sort(nums.begin(),nums.end());
int n = nums.size();
for (int i = 0; i < n; i++) {
if (nums[i] != i) {
return i;
}
}
return n;
}
};
方法二:数学公式
1.思想
1.当我求出数组的长度后,可以利用循环求出数组中每个数之和sum1
2.同理求出从0到数组大小的和,即(0+1+2+3+4+5+6....+n)sum2
3.sum2-sum1的差值就是所要找丢失的数
2.代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
int n=nums.size();
int sum1=0;
int sum2=0;
for(int i=0;i<n;i++){
sum1+=nums[i];
}
for(int i=0;i<=n;i++){
sum2+=i;
}
return sum2-sum1;
}
};
方法三:位运算
1.思想
数组nums 中有 n 个数,在这 n 个数的后面添加从 0 到 n 的每个整数,则添加了 n+1 个整数,共有 2n+1 个整数。
在 2n+1个整数中,丢失的数字只在后面 n+1个整数中出现一次,其余的数字在前面 nn个整数中(即数组中)和后面 n+1 个整数中各出现一次,即其余的数字都出现了两次。
根据出现的次数的奇偶性,可以使用按位异或运算得到丢失的数字。按位异或运算 满足交换律和结合律,且对任意整数 x 都满足 x 异或x = 0和x异或0=x
由于上述 2n+1 个整数中,丢失的数字出现了一次,其余的数字都出现了两次,因此对上述 2n+1 个整数进行按位异或运算,结果即为丢失的数字。
2.代码
class Solution {
public:
int missingNumber(vector<int>& nums) {
int res = 0;
int n = nums.size();
for (int i = 0; i < n; i++) {
res ^= nums[i];
}
for (int i = 0; i <= n; i++) {
res ^= i;
}
return res;
}
};
。