题目:
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 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 <= bad <= n <= 231 - 1
思考:
1、本题的关键在于:错误的版本之后的所有版本都是错的,那其实isBadVersion的代码可以如下写,其中1702766719就是我们要找的那个值bad :
private static boolean isBadVersion(int start) {
return start >= 1702766719;
}
2、这其实是可以利用二分查找的思路,对于输入的n,先判断N/2的位置是不是错误的版本,如果是错误的版本,那么就在前半部分里面找,如果不是错误的版本,那么就在后半部分里面找,递归该方法就可以了
3、注意递归的退出条件
代码:
public static void main(String[] args) {
//2126753390
//1702766719
System.out.println(firstBadVersion(2126753390));
}
public static int firstBadVersion(int n) {
return firstBadVersion1(1,n);
}
public static int firstBadVersion1(int start, int end) {
if (start == end) {
return start;
}
if (start + 1 == end) {
if (isBadVersion(start)) {
return start;
}
return end;
}
int temp = (int)(((long)start + end)/2);
if (isBadVersion(temp)) {
return firstBadVersion1(start,temp);
} else {
return firstBadVersion1(temp + 1, end);
}
}
private static boolean isBadVersion(int start) {
return start >= 1702766719;
}