本文共 2430 字,大约阅读时间需要 8 分钟。
class Solution: def merge(self, nums1: List[int], m: int, nums2: List[int], n: int) -> None: """ Do not return anything, modify nums1 in-place instead. """ nums1[m:] = nums2 nums1.sort()
class Solution: def merge(self,nums1:List[int],m:int,nums2:List[int],n:int) ->None nums1[m:] = nums2 nums1.sort()
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n
个版本 [1, 2, ..., n]
,你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version)
接口来判断版本号 version
是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
def firstBadVersion(self, n: int) -> int: l, r = 1, n while l < r: m = (l + r) // 2 if isBadVersion(m): r = m else: l = m + 1 return l
逐行解析这段代码:
pythonCopy code
def firstBadVersion(self, n: int) -> int:
这一行定义了一个名为 firstBadVersion
的函数。这个函数接受一个整数 n
作为参数(表示版本数量),并返回一个整数。这里的 self
是因为在力扣的类结构中,函数是作为一个方法定义的。
l, r = 1, n
初始化两个变量 l
和 r
。l
是我们考虑的版本范围的左界,r
是右界。初始时,l
是1,r
是 n
,这意味着我们正在考虑所有版本。
while l < r:
这是一个 while
循环,它会持续执行,直到 l
不再小于 r
。目标是逐渐缩小版本的范围,直到确定第一个坏的版本。
m = (l + r) // 2
计算中间版本号 m
。//
是整数除法,这意味着我们在找版本范围的中点。
if isBadVersion(m): r = m
调用 isBadVersion(m)
来检查版本 m
是否是坏的。如果是,则将 r
更新为 m
,这意味着我们需要在左半部分查找第一个坏的版本。
else: l = m + 1
如果版本 m
不是坏的,那么第一个坏的版本必然在 m
的右边,因此我们将 l
更新为 m + 1
,这意味着我们现在在右半部分查找第一个坏的版本。
当循环结束时,l
将指向第一个坏的版本。因此,我们返回 l
作为答案。
总结:这个函数使用了二分查找算法来找到第一个坏的版本。开始时,我们考虑所有版本,然后根据中间版本的情况将搜索范围缩小到左半部分或右半部分,直到确定第一个坏的版本为止。
示例 1:
输入:n = 5, bad = 4输出:4解释:调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true所以,4 是第一个错误的版本。
示例 2:
输入:n = 1, bad = 1输出:1
二分查找法
class Solution: def firstBadVersion(self, n: int) -> int: i, j = 1, n while i <= j: # 向下取整除法计算中点 m m = (i + j) // 2 # 若 m 是错误版本,则最后一个正确版本一定在闭区间 [i, m - 1] if isBadVersion(m): j = m - 1 # 若 m 是正确版本,则首个错误版本一定在闭区间 [m + 1, j] else: i = m + 1 # i 指向首个错误版本,j 指向最后一个正确版本 return i
class Solution: def firstBadVersion(self,n:int) -> int: i,j =1,n while i<= j: #向下取整除法计算中点m m =(i+j)//2 #若m是错误版本,则最后一个正确版本一定在 if isBadVersion(m): j=m-1 else: i =m+1 return i
class Solution: def firstBadVersion(self,n:int) -> int: i,j =1,n while i<=j: m= (i+j)//2 if isBadVersion(m): j=m-1 else: i=m+1 return i
转载地址:http://wemfk.baihongyu.com/