题目:
你是产品经理,目前正在带领一个团队开发新的产品。
不幸的是,你的产品的最新版本没有通过质量检测。
由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。
实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例:
给定 n = 5,并且 version = 4 是第一个错误的版本。
调用 isBadVersion(3) -> false
调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
我的思路:
利用二分法寻找一个当前值为一且,前面一个值为零的数
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
int b=n,c=0,w=n/2,q;
if(isBadVersion(n-1)==0){
return n;
}
while(1){
q=isBadVersion(w);
while(!q){
c=w;
w=w+(n-w)/2;
q=isBadVersion(w);
}
if(isBadVersion(w-1)==0){
break;
}
w=c+(w-c)/2;
}
return w;
}
算法虽然实现但是效果一般
leetcode标准答案:
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
if(n ==1){
return 1;
}
int start = 0;
int end = n;
int mid ;
int flag =0;
while(start<end){
mid = start + ( end -start) / 2;
if(isBadVersion(mid)){
end = mid;
}
else{
start = mid +1;
}
}
return start;
}
答案解析:
设定两个指针一个指向头一个指向尾,利用二分法将不断缩减两个指针间的距离当两个指针接触时程序结束