题目:
You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.
Suppose you have n
versions [1, 2, ..., n]
and you want to find out the first bad one, which causes all the following ones to be bad.
You are given an API bool isBadVersion(version)
which will return whether version
is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.
就是查找出现第一次badversion的那个位置。因为这个数列具有如下的特征,首先是就是从第i个开始之后的任意一个都是bad的,而且它要求查找的次数尽量少,如果采用一般的按顺序查找,必然出现超时的情况。仔细考虑这道题,其实因为有一点规律,那么就是相当于已经按照顺序排好了,那么就可以考虑用二分查找法来查找第一次出现bad的那个节点。所以这道题的思想就是二分查找,但是具体在执行二分查找的时候,还和我们平时的二分查找的方法有一点区别。
public class Solution extends VersionControl
{
public int firstBadVersion(int n)
{
int low = 1;
int high = n;
int t = 1;
int middle;
while(low <= high)
{
middle = low + (high - low) / 2;
if(isBadVersion(middle) == false)
low = middle + 1;
else
high = middle - 1;
}
return low;
}
}
这里的middle和我们普通的二分查找的还不太一样,是采用的一般的这种从低的往上加的策略。而在循环体中,则是采用两头夹逼的方式来寻找第一个出现bad的节点。