问题:产品经理针对某一项有bug的产品,想知道哪个版本最先开始出现bug[1]
输入:n个版本[1,2,...,n]
输出:the first bad one
主要思想:[2]
①二分查找,将O(n)提升为O(logn)
②避免mid=(l+r)/2时,溢出。设计了一个巧妙的trick,mid=l+(r-l)/2。
二分时,根据mid的两种情况进行分类:
· isBadVersion(mid)==true,搜索区间变为[l,mid]
· isBadVersion(mid)==flase,搜索区间变为[mid+1,r]
值得注意的是,最后return的不是mid,而是l.
// Forward declaration of isBadVersion API.
bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
int l = 1;
int r = n;
while(l<r)
{
int mid = l + (r-l)/2; // a tip to avoid overflow !!!
if(isBadVersion(mid))
{
r = mid;
}
else
{
l = mid+1;
}
}
return l;
}
};