剑指53:0~n-1中缺失的数字
这里要说明一下为什么是l<=r。因为初始化时我的r赋值是nums.length-1而不是nums.length.这二者其实是有很大区别的。前者相当于两端都是闭区间【l,r】,后者相当与左闭右开区间【l,r)。然后当搜索区间为空的时候就应该终止。这里的while(l<=r)的终止条件就是l == r+1,也就是此时的搜索区间是【r+1,r】,这肯定是不可能的,所以这个时候循环终止是正确的。而while(l<r)的终止条件是l==r,这个时候区间为[r,r],即此时区间里面还有一个值,这个时候非空,假如这样就退出的话那么其实是还有nums[r]这个数没有判断过
还有就是l = mid+1,r = mid-1问题:经常能看到有时候是r=mid,有时候是r=mid-1,这也需要理解。当我们发现mid不是我们要找的值的下标时,这个时候肯定想的是去搜索[l,mid-1]与[mid+1,r]区间,而mid已经确定不是了,因此就可以抛弃掉
上述的算法还存在局限性,因为还有一类题,存在重复元素,然后要你找出左边界和有边界,那么上述算法就无能为力了。马上就会来一道找左侧边界和右侧边界的值。
寻找数组中的某个值,该值可能有重复,寻找它的最左侧值的下标(下面的我想都用num.length-1,l<=r这种模式来做,不然容易记混)