一、题目
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 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
};
}