二分查找两类题型

342 阅读1分钟

题型一:可以在循环体内找到,程序提前结束

这一类问题的特点是:在循环体内可以找到目标元素,程序提前结束。代码的特点是:

  • 循环可以继续的条件是 while(left <= right)
  • 循环体内分为三个部分:
    • 找到了目标元素(程序提前结束):if(nums[mid] == target)
    • 移动左边界(排除 mid):left = mid + 1
    • 移动右边界(排除 mid):right = mid - 1

题型二:必须在退出循环以后才能确定答案

这一类问题的特点是:必须在退出循环以后才能确定答案。代码的特点是:

  • 循环可以继续的条件是 while(left < right)

  • 循环体内分为两个部分:一部分是排除 mid,另一部分是保留 mid

    • 情况 1:left = mid + 1right = mid
    • 情况 2:left = midright = mid - 1,此时 mid 须要上取整,以避免死循环
  • 重点 1:问题本身决定了代码应该怎么写,所以什么时候保留 mid,向左还是向右边继续查找,由问题本身决定。

  • 重点 2:循环体内写两个分支,保证退出循环以后 leftright 重合,否则需要做复杂的分类讨论。