博客
关于我
简单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 分组统计SQL语句
查看>>
Mysql 分页
查看>>
Mysql 分页语句 Limit原理
查看>>
MySql 创建函数 Error Code : 1418
查看>>
MySQL 创建新用户及授予权限的完整流程
查看>>
mysql 创建表,不能包含关键字values 以及 表id自增问题
查看>>
mysql 删除日志文件详解
查看>>
mysql 判断表字段是否存在,然后修改
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
mysql 前缀索引 命令_11 | Mysql怎么给字符串字段加索引?
查看>>
MySQL 加锁处理分析
查看>>
mysql 协议的退出命令包及解析
查看>>
mysql 参数 innodb_flush_log_at_trx_commit
查看>>
mysql 取表中分组之后最新一条数据 分组最新数据 分组取最新数据 分组数据 获取每个分类的最新数据
查看>>
MySQL 命令和内置函数
查看>>
mysql 四种存储引擎
查看>>
MySQL 在并发场景下的问题及解决思路
查看>>
MySQL 基础架构
查看>>
MySQL 基础模块的面试题总结
查看>>
MySQL 备份 Xtrabackup
查看>>