一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1:
输入: [0,1,3] 输出: 2
示例 2:
输入: [0,1,2,3,4,5,6,7,9] 输出: 8
易错实例:
输入:[1]
目标输出:0 常见错误输出为2
输入:[0]
目标输出:1
方法一:遍历
此题我使用的是最简单的遍历思想
将数组中的每一个数组都遍历,同时定义一个自加1的变量和数组遍历的数看是否相等,如果不相等则自加1变量就是缺失的那个数。fang
#include<iostream>
#include<vector>
class Solution {
public:
int missingNumber(std::vector<int> nums) {
int start = nums[0];
if (start != 0) return 0; //第一个数不为零,则就缺零这个数,直接返回跳出
for (int i = 0; i <nums.size(); i++) {
if (start == nums[i]) start++;
else break; //当不相等时直接跳出循环
}
return start;
}
};
int main() {
std::vector<int> a = {1,2 };
class Solution test;
std::cout<<test.missingNumber(a)<<std::endl;
}
方法二:二分法(利用左右边界)
解题思路:
排序数组中的搜索问题,首先想到 二分法 解决。
根据题意,数组可以按照以下规则划分为两部分。
左子数组: nums[i] = inums[i]=i ;
右子数组: nums[i] \ne inums[i]=i ;
缺失的数字等于 “右子数组的首位元素” 对应的索引;因此考虑使用二分法查找 “右子数组的首位元素” 。
流程图:
代码实现:
#include<iostream>
#include<vector>
class Solution {
public:
int missingNumber(std::vector<int> nums) {
int start = 0;
int end = nums.size() - 1;
while (start <= end) {
int mid = (start + end) / 2;
if (nums[mid] == mid) start = mid + 1;
else end = mid - 1;
}
return start;
}
};
int main() {
std::vector<int> a = {0,2};
class Solution test;
std::cout<<test.missingNumber(a)<<std::endl;
}