278. 第一个错误的版本https://leetcode.cn/problems/first-bad-version/
最不需要思考的思路,一个个检索,直到第i个=True,第i-1个=False,写循环检索。但显示超时。
那么有规则的数组,使用二分法:
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
if isBadVersion(1)==True:
return 1
if isBadVersion(n)==True and isBadVersion(n-1)==False:
return n
left,right=1,n
while left<right:
mid=left+(right-left)//2
if isBadVersion(mid)==True and isBadVersion(mid-1)==False:#从这个点开始,后面都是ture,所以无需重复判断
return mid
elif isBadVersion(mid)==False:
left=mid
else:
right=mid
效率没有特别高,因为在二分的时候,计算了一些重复元素
继续改进,减少重复检索:
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
if isBadVersion(1)==True:
return 1
if isBadVersion(n)==True and isBadVersion(n-1)==False:
return n
left,right=1,n
while left<=right:
mid=left+(right-left)//2
if isBadVersion(mid)==True and isBadVersion(mid-1)==False:#从这个点开始,后面都是ture,只有该点前一个点才是false
return mid
elif isBadVersion(mid)==True and isBadVersion(mid-1)==True:#位于错误点的右区间
right=mid-1
else:#isBadVersion(mid)==False:#位于错误点的左区间
left=mid+1
减少了一些重复点,效率很高了
官方版本:
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
if isBadVersion(1)==True:
return 1
if isBadVersion(n)==True and isBadVersion(n-1)==False:
return n
left,right=1,n
while left<right:
mid=left+(right-left)//2
if isBadVersion(mid)==True:
right=mid
else:
left=mid+1
return left