【剑指offer】53 - II. 0~n-1中缺失的数字
剑指 Offer 53 - II. 0~n-1中缺失的数字
知识点:数组,二分查找;
题目描述
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例
输入: [0,1,3]
输出: 2
输入: [0,1,2,3,4,5,6,7,9]
输出: 8
解法一:二分查找
看到排序数组--> 二分查找;
根据题目:可以根据是否和索引对应分成两部分:
- 1.nums[i] == i; 索引和值能一一对应上;
- 2.nums[i] != i; 索引和值对不上了;
我们要找的就是第一个对不上的时候的索引;也就是右子数组的首位元素;
和33题一样,要明确的一点是最后执行的一定是left=right=mid,而且此时mid左侧都是对应的,mid右侧都是不对应的,所以判断此刻mid的值:
- 1.nums[mid] == mid; 那left=mid+1就是第一个不匹配的;
- 2.nums[mid] != mid,那left就是第一个不匹配的;
所以最后返回left就可以了。
class Solution {
public int missingNumber(int[] nums) {
int left = 0, right = nums.length-1;
while(left <= right){
int mid = left + ((right-left) >> 1);
if(nums[mid] == mid){
left = mid+1; //一定在右边;
}else{
right = mid-1; //可能正好是mid,但是我们还是可以mid-1,因为最后如果相等了,我们返回的是left;
//在上面执行了+1的操作,所以正好是不等的。要始终明白在最后时刻的时候,left=mid=right,而且mid左边都排好了,mid右边都乱了,只要看mid这个就行了;
//(注意和153题区分,那里就不能减1);
}
}
return left;
}
}
- python
class Solution:
def missingNumber(self, nums: List[int]) -> int:
left, right = 0, len(nums)-1
while left <= right:
mid = left + (right-left) // 2
if nums[mid] == mid:
left = mid + 1
else:
right = mid -1
return left