这题也是Binary Search的经典题。
注意这题的index是从1开始,所以用模板的时候start=1, end=n即可(前闭后闭)。 因为我们要调用SVNRepo::isBadVersion(mid),该函数是从下标从1开始找,我们无法掌控。
这题就相当于从000000011111中找到第一个1出现的位置。跟Binary Search找重复元素第一个出现的位置的题差不多。
代码如下:
int findFirstBadVersion(int n) {
int start=1, end=n;
while(start+1<end) {
int mid=start+(end-start)/2;
if (SVNRepo::isBadVersion(mid)) end=mid;
else start=mid;
}
if (SVNRepo::isBadVersion(start)) return start;
return end;
}