题目
代码
C语言:
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
int firstBadVersion(int n) {
int left = 1;
int right = n;
while (left <=right)
{
int mid = left + (right-left)/2; //在二分查找中,选取 \mathrm{mid}mid 的方法一般为 mid=1/2(left+right),如果使用的编程语言会有整数溢出的情况(例如 C++,Java),所以用此句代码代替。
if(isBadVersion(mid)) //申清题意,true表示出错!!!
{
right = mid-1; //范围缩小到mid左边部分
}
else
{
left = mid+1; //没出错则范围缩小到mid右边部分
}
}
return left;//最后当left=mid时,mid值当left<=right
}
用到的核心方法
二分查找法
代码分析(收获):
1.举例分析如下:
2.while (left <= right):
循环结束的条件,当left==right的时候,说明范围已经缩减到了最后一个能够寻找的值,不管有没有找到,结束了这次循环之后,整个搜索都应该结束(因为left>right没有意义了)
3.为什么要用二分法:(参考链接:https://leetcode-cn.com/problems/first-bad-version/solution/wei-shi-yao-yong-er-fen-fa-by-vailing/)
此题本质就是在一个有序数组中 寻找 某个符合我们条件的 值,搜索的方法有很多,但是对于在有序数组中,最有效的就是二分搜索法,二分搜索法就是我们不断找数组中点来进行比较。同时对于此题与实际的二分搜索法有所区别的是我们找到版本错误的不能马上返回,因为我们找的是第一个出现错误的,所以我们不能保证前面没有出现错误的,所以找到出现错误的以后我们就应该去掉后面的一半(找第一个出现错误的版本,后面没有用),如果找到的是没有出现错误的,那么出现错误的一定在后面所以要舍去前面一半。