第一个错误的版本
二分思想扩展
在处理递增递减或者有定向规律性的一串数据时,(例如:从11111000中找到最后一个1 )可以使用二分查找的思想。示例如下:
需求描述
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例
输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
1
2
3
4
5
6
7
2
3
4
5
6
7
输入:n = 1, bad = 1
输出:1
1
2
2
代码
/* The isBadVersion API is defined in the parent class VersionControl.
boolean isBadVersion(int version); */
/*
拿到的数据是这样的:true true true true true true false false false false
需要找的是第一个错误版本,也就是第一个true,并且是有定向规律的数据所以使用二分查找
*/
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
//定义左右指针
int l=1,r=n,m;
while(l<r){
//计算中间指针
m=(r+l)>>>1;
//注意:是错误版本为true,不是为false
//中间指针是true则说明当前版本为错误版本,要从[l,m]找
if(isBadVersion(m)){
r=m;
}else{
l=m+1;//为false则从[m+1,r]找
}
}
return r;
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
上次更新: 2023/12/29 11:32:56