题目:
难度简单384收藏分享切换为英文接收动态反馈
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
示例 1:
输入:n = 5, bad = 4 输出:4 解释:调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
示例 2:
输入:n = 1, bad = 1
输出:1
提示:
1 <= bad <= n <= 231 - 1
自己的解答:
# The isBadVersion API is already defined for you.
# @param version, an integer
# @return an integer
# def isBadVersion(version):
class Solution:
def firstBadVersion(self, n):
"""
:type n: int
:rtype: int
"""
low,high,mid = 1,n,(n+1)//2
while low<high:
if isBadVersion(mid):
high = mid-1
mid = (low+high)//2
else:
low = mid+1
mid = (low+high)//2
if isBadVersion(low):
return low
else:
return low+1
比较简单,但是要尽可能的少调用那个api
所以尽量减少判断,从两端进行夹逼,考虑最终夹逼到距离为1和0两个时刻
最后可能都停在low也可能都在high
因此最后要加一个判断
执行用时:24 ms, 在所有 Python3 提交中击败了97.10%的用户
内存消耗:14.9 MB, 在所有 Python3 提交中击败了45.84%的用户
性能还过得去吧。
在提供一个评论的,性能差一点的,但是更加简洁
class Solution:
def firstBadVersion(self, n):
left, right = 1, n
while right > left:
mid = left + (right - left)//2
if isBadVersion(mid):
right = mid
else :
left = mid + 1
return left
这里始终保障right在右半区,采用更保守的更新方式
但是这样对于多次更新的情况性能会避免不了略微下降。