二分法:判断某一target是否在此数组中,若在则返回下表,否则返回-1
二分法易错点:
1.while循环时究竟为left<right还是left<=right
2.更新区间时是middle还是middle-1
首先,对于区间的定义一般为左闭右闭或左闭右开[left,right] / [left,right)
左闭右闭:
left = 0
right = numsize-1
循环条件:(left <= right)(此时区间合法)
if(nums[middle] > target) right = middle - 1(middle已经判断过不是,由于左闭右闭,应把区间缩小)
elseif(nums[middle] < target) left = middle + 1 (与以上相同)
else return middle
return -1
左闭右开:
left = 0
right = numsize(开,所以不用-1)
循环条件:(left < right)(此时小于才能使区间合法)
if(nums[middle] > target) right = middle (middle已经判断过不是,由于右开,此时right = middle含义就是不包括middle,注意此处差别!!!)
elseif(nums[middle] < target) left = middle + 1 (注意差别!!middle不在,由于左闭,所以一定要+1)
else return middle
return -1
leetcode实战:
注意,此处求(right+left)/2的另一种写法
可防止溢出