目录
题目:
一个长度为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来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/que-shi-de-shu-zi-lcof
思路:
这道题给的是排序好的数组,因此我们要找到数据优先考虑二分查找。
分析可知,要查找的点前面的数据=下标,自身和后面的不等于
这里分为三种情况二分查找
1.查找值(nums[mid])等于mid,则向后查找
2.不相等且前一位相等或者mid为0,则这就是要找的点
3.不相等且前一位不相等(同时mid不为0),向前查找。当我们把主要代码写完后,要考虑是否有特殊情况。我们发现每次都要找到缺失点的下一个来比较,因此当缺失点为最后一个时,我们无法找到,会导致begin>end=length-1走出循环,因此最后要判断begin=length的情况。
代码:
public class Go53_2 {
public static void main(String[] args) {
Solution53_2 solution53_2=new Solution53_2();
System.out.println(solution53_2.missingNumber(new int[]{0,1,2,3}));
}
}
class Solution53_2{
public int missingNumber(int[] nums){
int length=nums.length;
int begin=0;
int end=length-1;
int mid;
/*这里分为三种情况二分查找
1.查找值(nums[mid])等于mid,则向后查找
2.不相等且前一位相等或者mid为0,则这就是要找的点
3.不相等且前一位不相等(同时mid不为0),向前查找。
*/
while(begin<=end){
mid=(begin+end)/2;
if(nums[mid]==mid){
begin=mid+1;
}else if(mid==0||nums[mid-1]==mid-1){
return mid;
}else{
end=mid-1;
}
}
if(begin==length){
return length;
}
return -1;
}
}
结果: