✨题目
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 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,所以预料到可能会超时,交了之后发现确实超时了
那么这个题怎么做呢?仔细读了一边题目之后不难发现,只要找到一个错误的版本,那么其后面的所有版本都是错误的,但我们还需要往前面去找,因为无法判断当前的这个错误版本是不是第一个错误的版本。所以,问题可以简化成:
- 找到中间位置,判断其是正确的还是错误的,
- 如果是错误的,那么就往其左区间找(因为右区间一定都是错误的)
- 如果是正确的,那么就往右区间找(因为左区间一定都是正确的)
- 到最后当 left == right 的时候,其代表的值就是第一个错误的版本