题型一:可以在循环体内找到,程序提前结束
这一类问题的特点是:在循环体内可以找到目标元素,程序提前结束。代码的特点是:
- 循环可以继续的条件是
while(left <= right); - 循环体内分为三个部分:
- 找到了目标元素(程序提前结束):
if(nums[mid] == target); - 移动左边界(排除
mid):left = mid + 1; - 移动右边界(排除
mid):right = mid - 1。
- 找到了目标元素(程序提前结束):
题型二:必须在退出循环以后才能确定答案
这一类问题的特点是:必须在退出循环以后才能确定答案。代码的特点是:
-
循环可以继续的条件是
while(left < right); -
循环体内分为两个部分:一部分是排除
mid,另一部分是保留mid。- 情况 1:
left = mid + 1,right = mid; - 情况 2:
left = mid,right = mid - 1,此时mid须要上取整,以避免死循环
- 情况 1:
-
重点 1:问题本身决定了代码应该怎么写,所以什么时候保留
mid,向左还是向右边继续查找,由问题本身决定。 -
重点 2:循环体内写两个分支,保证退出循环以后
left和right重合,否则需要做复杂的分类讨论。