当前位置:网站首页>二分查找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;
}
}
边栏推荐
猜你喜欢
随机推荐
[XSS, file upload, file inclusion]
借助ginput函数在figure窗口实时读取、展示多条曲线的坐标值
NIO知识汇总 收藏这一篇就够了!!!
深度学习理论课程第八、九、十章总结
ZEMAX | 如何使用渐晕系数
中空编码器的作用——唯样商城
梯度下降、反向传播
Typora
opencv
电子元器件之电子变压器可分为哪几类?
自监督论文阅读笔记: MoCoV2使用动量对比学习改进基线
增强光学系统设计 | Zemax 全新 22.2 版本产品现已发布!
A.1#【内存管理】——1.1.1 node:struct pglist_data
2021-03-22
自监督论文阅读笔记Reading and Writing: Discriminative and Generative Modelingfor Self-Supervised Text Recogn
滚动条 scrollbar 和scrollbar-thumb 样式
代码没写完,哪里有脸睡觉!17 张程序员壁纸推荐
自监督论文阅读笔记 Self-supervised Learning in Remote Sensing: A Review
建立平衡二叉树简单demo
PCB设计经验之模拟电路和数字电路区别为何那么大