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 havenversions[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 APIbool isBadVersion(version)which will return whetherversionis bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.
Credits:
Special thanks to@jianchao.li.fighterfor adding this problem and creating all test cases.
The Idea: Binary search until we are able to converge into the region that separates the last good version to the first bad version.
[1 1 1 1 1 1 1 1 1 1 0 0 0 0 0]
^
Complexity: O(logn) time and O(1) space through iterative binary search
# The isBadVersion API is already defined for you.# @param version, an integer# @return a bool# def isBadVersion(version):classSolution(object):deffirstBadVersion(self,n):""" :type n: int :rtype: int""" left, right =1, nwhile left < right: mid =int(left +((right - left)>>1))ifnotisBadVersion(mid):# search right left = mid +1else:# search left right = mid -1ifisBadVersion(left):return leftelse:return left +1