简单sorting and searching 合并+第一个错误版本 二分查找法

这篇博客讨论了一种使用二分查找算法来高效地找出软件版本中第一个错误版本的方法。在给定一个版本号范围和一个API来判断版本是否出错的情况下,通过迭代逐步缩小范围,最终确定导致所有后续版本错误的起始版本号。示例展示了如何在不同场景下应用二分查找,从而减少API调用次数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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()

2. 278 第一个错误的版本

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 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

初始化两个变量 lrl 是我们考虑的版本范围的左界,r 是右界。初始时,l 是1,rn,这意味着我们正在考虑所有版本

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

医疗AI强化曾小健

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值