278 First Bad Version

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):
class Solution(object):
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
left, right = 1, n
while left < right:
mid = int(left + ((right - left) >> 1))
if not isBadVersion(mid): # search right
left = mid + 1
else: # search left
right = mid - 1
if isBadVersion(left):
return left
else:
return left + 1