一道让我印象深刻的题
因为让我知道了在binary search中,index的设置:包括初始化,更新条件,的本质意义是什么,对于解题和把握细节的重要作用!
应该可以5min写完
汗!!居然要用long来完成。。。因为要用到mid=(prevGood+currBad)/2,当prevGood和currBad都很大时,加和就overflow int的范围了
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
/* long currGood=1;
long nextBad=n;
while(currGood<nextBad){
long mid=(currGood+nextBad)/2;
if( isBadVersion((int)mid) ) nextBad=mid-1;
else currGood=mid;
}
return (int)(currGood+1);
*/ // 上面这个做法,和题意有一点不合,那就是这里面至少有一个bad。。。按照上面的变量命名就可以知道策略,就是currGood要代表这一定是good的,但是1位置不一定是good。。所以不合适!但是下面的设计就是说,currBad=n,是make sense的,因为至少有一个Bad version,所以n肯定是。。。要注意了。。在设计二分法的是前后两个index,一定都是从给定的区间左右极值来的。。否则算法失败!!
long prevGood=1;
long currBad=n;
while(prevGood<currBad){
long mid=(prevGood+currBad)/2;
if(isBadVersion((int)mid)) currBad=mid;
else prevGood=mid+1;
}
return (int)prevGood; // prevGood==currBad, 这是while循环跳出的条件,所以return 哪个都可以。。。
}
}