当前位置:网站首页>【LeetCode-278】第一个错误的版本
【LeetCode-278】第一个错误的版本
2022-08-11 05:30:00 【Ring*】
10.3 第一个错误的版本【278】
10.3.1 题目描述
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, …, n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
10.3.2 方法一:二分查找
思路及算法
因为题目要求尽量减少调用检查接口的次数,所以不能对每个版本都调用检查接口,而是应该将调用检查接口的次数降到最低。
注意到一个性质:当一个版本为正确版本,则该版本之前的所有版本均为正确版本;当一个版本为错误版本,则该版本之后的所有版本均为错误版本。我们可以利用这个性质进行二分查找。
具体地,将左右边界分别初始化为 1 和 n,其中 n 是给定的版本数量。设定左右边界之后,每次我们都依据左右边界找到其中间的版本,检查其是否为正确版本。如果该版本为正确版本,那么第一个错误的版本必然位于该版本的右侧,我们缩紧左边界;否则第一个错误的版本必然位于该版本及该版本的左侧,我们缩紧右边界。
这样我们每判断一次都可以缩紧一次边界,而每次缩紧时两边界距离将变为原来的一半,因此我们至多只需要缩紧 O(logn) 次。
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
int left = 1, right = n;
while (left < right) {
// 循环直至区间左右端点相同
int mid = left + (right - left) / 2; // 防止计算时溢出
if (isBadVersion(mid)) {
right = mid; // 答案在区间 [left, mid] 中
} else {
left = mid + 1; // 答案在区间 [mid+1, right] 中
}
}
// 此时有 left == right,区间缩为一个点,即为答案
return left;
}
}
复杂度分析
- 时间复杂度:O(logn),其中 n 是给定版本的数量。
- 空间复杂度:O(1)。我们只需要常数的空间保存若干变量。
10.3.3 my answer—二分查找
/* 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;
int right = n;
int mid = 0;
while(left < right){
mid = left + (right - left) / 2;
if(isBadVersion(mid)){
right = mid;
}else {
left = mid + 1;
}
}
return left;
}
}
边栏推荐
猜你喜欢
127.0.0.1 connection refused
实时特征计算平台架构方法论和基于 OpenMLDB 的实践
mk文件介绍
Vscode remote connection server terminal zsh+Oh-my-zsh + Powerlevel10 + Autosuggestions + Autojump + Syntax-highlighting
[Meetup] OpenMLDBxDolphinScheduler engineering and scheduling link link characteristics, building the end-to-end MLOps workflow
C语言-7月21日-指针的深入
swagger错误:WARN i.s.m.p.AbstractSerializableParameter - [getExample,421] - Illegal DefaultValue null
Visual studio2019 configuration uses pthread
Day 77
JS事件循环机制
随机推荐
实时特征计算平台架构方法论和基于 OpenMLDB 的实践
gerrit configure SSH Key and account, email information
mk文件介绍
Day 87
OpenMLDB Pulsar Connector: Efficiently connect real-time data to feature engineering
js 学习进阶(事件高级 pink老师教学笔记)
虚拟机更改IP地址
Asis2016 books null off by one
js learning advanced BOM part (pink teacher notes)
Intelligent risk control China design and fall to the ground
Here is a memorial
一文看懂注解与反射
The third phase of the contributor task is wonderful
Day 70
Tinker's self-introduction
Dark Horse Event Project
Getting Started with JNI
The Summer of Open Source 2022 is coming | Welcome to sign up for the OpenMLDB community project~
JS this关键字
【无标题】