剑指 Offer 53 - II. 0~n-1中缺失的数字
题目描述:
一个长度为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
思路一:循环遍历数组,查看当前数是否等于下标,如果是则遍历下一个直到数组尾部返回数组的长度,否则返回当前下标。
代码如下:
python:
#循环遍历
class Solution:
def missingNumber(self, nums: List[int]) -> int:
for i in range(len(nums)):
if nums[i] == i:
if i == (len(nums) - 1):
return i + 1
continue
return i
c++:
class Solution {
public:
int missingNumber(vector<int>& nums) {
int i = 0;
for(vector<int>::iterator it = nums.begin(); it != nums.end(); it++){
if(*it == i){
if(i == nums.size() - 1){
return i+1;
}
i++;
continue;
}
return i;
}
return 0;
}
};
思路二:二分查找,主要还是二分法,题目每个条件都是有用的。所有题都拿来遍历,offer也就遍历到别人那里去了。
首先我们设置左节点以及有节点,然后我们将中间节点设置为 ( l e f t + r i g h t ) / 2 (left + right)/2 (left+right)/2 如果中间节点等于数组下标,那么说明数组的 [left, mid] 是完整的,则我们需要继续查找 [mid, right],否则我们认为 [left, mid] 是不完整的,这是我们将有指针指向 m i d − 1 mid-1 mid−1 继续在 [left , mid-1]中查找。
代码如下:
python:
class Solution:
def missingNumber(self, nums: List[int]) -> int:
left = 0
right = len(nums) - 1
while left <= right:
mid = (left + right) // 2
if nums[mid] == mid:
left = mid + 1
else:
right = mid - 1
return left
c++ :
class Solution {
public:
int missingNumber(vector<int>& nums) {
int left = 0;
int right = nums.size()-1;
while(left <= right){
int mid = (left + right) / 2;
if(nums[mid] == mid){
left = mid + 1;
}
else{
right = mid -1;
}
}
return left;
}
};