這道題用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;
}
};