算法练习第42题-第一个错误的版本

249 阅读2分钟

一、题目

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

假设你有 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

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re… 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

二、解题思路

这个题考查的是二分查找

暴力解法

  • 通过for循环,从小到大排序,如果isBadVersion(i)等于ture,那么就返回i

二分查找思路

  • 有题可知,选择的版本号大于最初错误版本时,都为true,
  • 那么就找到了最大的右区间, 相对而言,就可以因此缩小范围
  • 首先定义左右区间,left = 0 right = n 定义中间值mid = left + Math.floor((right - left)>>1)
  • 如果isBadVersion(mid)等于ture,那么right = mid + 1
  • 如果不等于true,那么就left = mid + 1
  • 直到循环结束,当left < right 不成立的时候,返回left,就得到了最终的值

三、代码解析

暴力解法

let solution = function(isBadVersion) {
  /**
   * @param {integer} n Total versions
   * @return {integer} The first bad version
   */
  return function(n) {
    for(let i = 0; i <= n; i++) {
      if(isBadVersion(i)) {
        console.log(i)
        return i
      }
     }
  };
}

二分查找解题

let solution = function(isBadVersion) {
  /**
   * @param {integer} n Total versions
   * @return {integer} The first bad version
   */
  /**
   * 二分查找
   * 有题可知,选择的版本号大于最初错误版本时,都为true,
   * 那么就找到了最大的右区间, 相对而言,就可以因此缩小范围
   * 首先定义左右区间,left = 0 right = n 定义中间值mid = left + Math.floor((right - left)>>1)
   * 如果isBadVersion(mid)等于ture,那么right = mid + 1
   * 如果不等于true,那么就left = mid + 1
   * 直到循环结束,当left < right 不成立的时候,返回left,就得到了最终的值 
   * 
   * **/ 
  return function(n) {
    let left = 0, right = n
    while(left < right) {
      let mid = left + Math.floor((right - left)>>1)
      if(isBadVersion(mid)) {
        right = mid
      } else {
        left = mid + 1
      }
    }
    return left
  };
}

四、测试结果

暴力解法

image.png

二分查找

image.png