这道题用Binar Search到是没有什么难度,主要的就是判断中间点的时候容易出错。起初我用的是left = 1, high = n; mid = (left + high)/2,但是不AC。后来发现当起始下标为1的时候,这种求mid会Overflow,这种情况是适用于left从0开始的。从1开始的话需要使用mid = left + (high -left) / 2来计算。即可AC:
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int low = 1;
int high = n;
int mid;
while(low < high)
{
mid = low + (high-low)/2; //(left+high)/2 will result a overflow
if(isBadVersion(mid)) // is bad
{
if(mid <= 1)
return mid;
else
{
if(!isBadVersion(mid-1)) //前面一个不坏
return mid;
else
high = mid;
}
}
else
low = mid + 1;
}
return high;
}
};