博客
关于我
简单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 1264_关于mysql 出现 1264 Out of range value for column 错误的解决办法
查看>>
mysql 1593_Linux高可用(HA)之MySQL主从复制中出现1593错误码的低级错误
查看>>
mysql 5.6 修改端口_mysql5.6.24怎么修改端口号
查看>>
MySQL 8.0 恢复孤立文件每表ibd文件
查看>>
MySQL 8.0开始Group by不再排序
查看>>
mysql ansi nulls_SET ANSI_NULLS ON SET QUOTED_IDENTIFIER ON 什么意思
查看>>
multi swiper bug solution
查看>>
MySQL Binlog 日志监听与 Spring 集成实战
查看>>
MySQL binlog三种模式
查看>>
multi-angle cosine and sines
查看>>
Mysql Can't connect to MySQL server
查看>>
mysql case when 乱码_Mysql CASE WHEN 用法
查看>>
Multicast1
查看>>
mysql client library_MySQL数据库之zabbix3.x安装出现“configure: error: Not found mysqlclient library”的解决办法...
查看>>
MySQL Cluster 7.0.36 发布
查看>>
Multimodal Unsupervised Image-to-Image Translation多通道无监督图像翻译
查看>>
MySQL Cluster与MGR集群实战
查看>>
multipart/form-data与application/octet-stream的区别、application/x-www-form-urlencoded
查看>>
mysql cmake 报错,MySQL云服务器应用及cmake报错解决办法
查看>>
Multiple websites on single instance of IIS
查看>>