✨题目

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

✨样例

输入:n = 5, bad = 4 输出:4 解释: 调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。

输入:n = 1, bad = 1 输出:1

✨提示

  • 1 <= bad <= n <= 231 - 1

✨思路

最简单能直接想到的思路,就是直接遍历一次整个数组,依次判断每个版本是否是错误的,一旦发现的错误的就直接break,结束循环(因为要找到的是第一个错误的版本)。但是题目提示的数据量有231 - 1,所以预料到可能会超时,交了之后发现确实超时了
image.png

那么这个题怎么做呢?仔细读了一边题目之后不难发现,只要找到一个错误的版本,那么其后面的所有版本都是错误的,但我们还需要往前面去找,因为无法判断当前的这个错误版本是不是第一个错误的版本。所以,问题可以简化成:

  1. 找到中间位置,判断其是正确的还是错误的,
  2. 如果是错误的,那么就往其左区间找(因为右区间一定都是错误的)
  3. 如果是正确的,那么就往右区间找(因为左区间一定都是正确的)
  4. 到最后当 left == right 的时候,其代表的值就是第一个错误的版本