当前位置:网站首页>二分查找5 - 第一个错误的版本
二分查找5 - 第一个错误的版本
2022-08-03 05:25:00 【花开花落夏】
第一个错误的版本
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
来源:力扣(LeetCode)二 解题
根据题目要求,若第k个数为正确版本,第k+1个数为错误版本,则k+1为所求的值。使用二分查找来求k值,k为mid。
注意:有一种情况,当left=right时(例如left=right=1),left值还没有做出有效判断。因此在最后加一个if(isBadVersion(left)) return left;
来判断left=right时的情况。
/* The isBadVersion API is defined in the parent class VersionControl. boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1,right = n,mid;
if(n==1&&isBadVersion(n)){
return n;
}else{
while (left<right){
mid = left+(right-left)/2;
if((!isBadVersion(mid))&&isBadVersion(mid+1)){
return mid+1;
}else if(!isBadVersion(mid)){
left=mid+1;
}else{
right=mid;
}
}
}
if(isBadVersion(left)) return left;
return -1;
}
}
运行效率较低
三 优化
当mid值为错误版本时,结果小于等于mid,当mid值为正确版本时,结果大于mid。因此我们可以使用此条件逐渐收缩范围,当范围为一个值时,就为所求的值。
/* The isBadVersion API is defined in the parent class VersionControl. boolean isBadVersion(int version); */
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1,right = n,mid;
while(left<right){
mid = left+(right-left)/2;
if(isBadVersion(mid)){
right=mid;
}else{
left=mid+1;
}
}
return left;
}
}
边栏推荐
- 自监督论文阅读笔记 Self-supervised Label Augmentation via Input Transformations
- 6. What is the difference between Vector, ArrayList and LinkedList?(design, performance, safety)
- 建立平衡二叉树简单demo
- 卷积神经网络入门
- JS--正则表达式
- 【第四周】MobileNet和HybridSN
- What is parametric design, let's understand it through practical operation?| SOLIDWORKS How-To Videos
- Practice of MySql's Sql statement (try how many you can write)
- MySql的Sql语句的练习(试试你能写出来几道呢)
- JSP的基本使用
猜你喜欢
随机推荐
自我监督学习和BERT模型
MMU 介绍-[TBL/page table work]
SolidWorks 操作视频 | 隐藏高手必备工具Defeature,让设计隐藏更彻底
Qemu 搭建Armv8 平台
对象の使用
Makefile
进程间通信IPC - 信号量
ZEMAX | 探究 OpticStudio 偏振分析功能
自监督论文阅读笔记 Incremental-DETR:Incremental Few-Shot Object Detection via Self-Supervised Learning
Convolutional Nerual Nertwork(CNN)
MCU接收串口字符型数据转换成数据型数据
自监督论文阅读笔记: MoCoV2使用动量对比学习改进基线
Makefile自动推导的简单例程
Delightful Nuxt3 Tutorial (2): Build a Blog Quickly and Easily
MATLAB给多组条形图添加误差棒
enum和enum class的区别
西塞罗 论老年
ZEMAX | 如何围绕空间中的任何点旋转任何元素
cobalt strike 的基础使用
增强光学系统设计 | Zemax 全新 22.2 版本产品现已发布!