博客
关于我
简单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/

你可能感兴趣的文章
mysqldump备份时忽略某些表
查看>>
mysqldump实现数据备份及灾难恢复
查看>>
mysqldump数据库备份无法进行操作只能查询 --single-transaction
查看>>
mysqldump的一些用法
查看>>
mysqli
查看>>
MySQLIntegrityConstraintViolationException异常处理
查看>>
mysqlreport分析工具详解
查看>>
MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
查看>>
Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
查看>>
mysql_real_connect 参数注意
查看>>
mysql_secure_installation初始化数据库报Access denied
查看>>
MySQL_西安11月销售昨日未上架的产品_20161212
查看>>
Mysql——深入浅出InnoDB底层原理
查看>>
MySQL“被动”性能优化汇总
查看>>
MySQL、HBase 和 Elasticsearch:特点与区别详解
查看>>
MySQL、Redis高频面试题汇总
查看>>
MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
查看>>
mysql一个字段为空时使用另一个字段排序
查看>>
MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
查看>>
MYSQL一直显示正在启动
查看>>