博客
关于我
简单sorting and searching 合并+第一个错误版本 二分查找法
阅读量:797 次
发布时间:2023-03-12

本文共 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()

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

转载地址:http://wemfk.baihongyu.com/

你可能感兴趣的文章
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 深度分页性能急剧下降,该如何优化?
查看>>
MySQL 添加列,修改列,删除列
查看>>
mysql 添加索引
查看>>
MySQL 添加索引,删除索引及其用法
查看>>
mysql 状态检查,备份,修复
查看>>
MySQL 用 limit 为什么会影响性能?
查看>>
MySQL 用 limit 为什么会影响性能?有什么优化方案?
查看>>