二分。
没错,又是个二分,二分杀死我
看的题解也懵了好久。
但总结出一个东西,如果给的是有序数组,优先考虑二分法.
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内。在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
示例 1: 输入: [0,1,3]
输出: 2
具体细节写在代码注释里面吧(好理解)
class Solution {
public int missingNumber(int[] nums) {
int i=0,j=nums.length-1;
//利用二分,确定缺失的数。
while(i<=j){
int m=(i+j)/2;
if(nums[m]==m)//说明缺失的数在右边
i=m+1;
else//说明缺失的数在左边
j=m-1;
}
//最后i和j指向的就是缺失的数(i和j是下标)
//然后执行j=m-1才会退出循环
return i;//或者return j+1
}
}
这道题建立大家手动遍历一下,难点是循环退出的条件和二分查找缺失的数的区间。
如果不手动遍历一遍,很难想象出来.