二分搜索法
易混点:
1.left是小于right还是小于等于right
2.更新的时候是更新到mildle还是midle-1
3.区间是 [left,right] 还是 [left,right),对区间的定义不同会影响到边界的处理
左闭右闭写法
伪代码
left = 0;
right = numsize - 1;
while(left <= right)//思考在区间里,left和right能取到相等吗?如[1,1] = 1,而[1,1)就是一个不合法区间,即他不能取到1,但又能取到1
{
mildle = (left + right)/2;
if(nums[midle] > target)
right = midle - 1;//因为已经判断为target在[left,midle]里面,
//为了防止后面的循环继续判断midle是否为target,所以更新为midle-1
//就把midle卡到接下来搜索的区间的外面了
else if(nums[midle] < target)
left = midle + 1;
else
return midle;
}
return -1;
左闭右开写法
伪代码
left = 0;
right = numsize - 1;
while(left < right)//思考在区间里,left和right能取到相等吗?如[1,1] = 1,而[1,1)就是一个不合法区间,即他不能取到1,但又能取到1
{
mildle = (left + right)/2;
if(nums[midle] > target)
right = midle;//因为已经判断为midle不和target一样,即target在[left,midle)里
//面,因为这个循环的写法是基于[left,right),搜索本来就不会包含right
//所以即可让right=midle,继续迭代循环下去
else if(nums[midle] < target)
left = midle + 1;
else
return midle;
}
return -1;