题目描述有点问题,每个数字都在范围0~n之内,而不是0~n-1
遍历:
缺失的中间部分
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len = nums.size();
if (nums[0] != 0) return 0;
if (nums[len - 1] != len) return len;
int record = nums[0];
for (int i = 0; i < len; ++i) {
if (nums[i] - record > 1) return record + 1;
record = nums[i];
}
return -1;
}
};
二分:
考虑到数组只有一个数的情况,所以 while 循环要加等号,因为加了等号所以最终跳出循环时,low 肯定大于 high,根据条件判定,此时 low 的值就是目标数字
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len = nums.size();
int low = 0, high = len - 1;
while (low <= high) {
int mid = (low + high) >> 1;
if (nums[mid] == mid) {
low = mid + 1;
}
else {
high = mid - 1;
}
}
return low;
}
};
异或:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int len = nums.size();
int res = len;
for (int i = 0; i < len; ++i) {
res ^= nums[i] ^ i;
}
return res;
}
};