LeetCode算法入门 — 第一个错误的版本

107 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

第一个错误的版本

原题地址

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

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

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

  示例 1:

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

示例 2:

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

思路分析

  1. 题目要求尽量减少对调用 API 的次数,因此不能每个版本都调用 API
  2. 从题目信息中可以得出一条结论:如果一个版本是正确的,那么这个版本之前的版本都是正确的;如果一个版本是错误的,那么这个版本之后的版本都是错误的。因此可以使用二分查找法来实现;
  3. 按照初始左右边界为1和n,来取中值检验是否为坏的版本,如果中值是正确的版本,那么错误的版本在中值到右边界之间,于是需要更新左边界值;若中值是错误的版本,那么错误的版本在左边界到中值之间,此时需要更新有边界值。
  4. 等到左右边界值相等时,即为要找的坏版本。

AC 代码

/**
 * Definition for isBadVersion()
 * 
 * @param {integer} version number
 * @return {boolean} whether the version is bad
 * isBadVersion = function(version) {
 *     ...
 * };
 */

/**
 * @param {function} isBadVersion()
 * @return {function}
 */
var solution = function(isBadVersion) {
    /**
     * @param {integer} n Total versions
     * @return {integer} The first bad version
     */
    return function(n) {
        let left = 1, right = n;
        while (left < right) {
            const mid = Math.floor(left + (right - left) / 2);
            if (isBadVersion(mid)) {
                right = mid;
            } else {
                left = mid + 1;
            }
        }
        return left;
    };
};

结果:

  • 执行结果: 通过
  • 执行用时:60 ms, 在所有 JavaScript 提交中击败了77.03%的用户
  • 内存消耗:41.1 MB, 在所有 JavaScript 提交中击败了8.28%的用户
  • 通过测试用例:22 / 22

END