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