278. 第一个错误的版本
题目:每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
链接 https://leetcode.cn/problems/first-bad-version
个人思路
- 就一个二分法,没啥,二分法也就注意边界即可
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
if isBadVersion(1):
return 1
# n==2其实也不需要单独判断
# if n == 2:
# return 1 if isBadVersion(1) else 2
left = 1
right = n
while left <= right:
mid = int((left + right) / 2)
# 当mid是错误版本而其前一个不是则mid是第一个错误版本
if isBadVersion(mid) and not isBadVersion(mid-1):
return mid
if isBadVersion(mid):
# right不用减1,因为有可能是第一个错误版本
right = mid
else:
# mid+1是因为mid已经不是错误,那第一个错误版本只能从mid+1开始
left = mid+1
return mid
- 官方写的更为优雅,但没有python版本,这里改一个python版本:
# The isBadVersion API is already defined for you.
# def isBadVersion(version: int) -> bool:
class Solution:
def firstBadVersion(self, n: int) -> int:
left = 1
right = n
while left < right:
mid = int(left + (right - left) / 2) # 防止计算时溢出
if isBadVersion(mid):
right = mid # 答案在区间 [left, mid] 中
else:
left = mid+1 # 答案在区间 [mid+1, right] 中
# 此时有 left == right,区间缩为一个点,即为答案
return left
时间复杂度O(logn) : 其中 n 为版本数;二分查找使用对数级别时间。
空间复杂度 O(1) : 变量 left , right 使用常数大小空间。