持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情
今天,我们继续搞算法。
题目描述
你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。
假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。
你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。
题目分析
这个题目是让我们查找一个坏的版本,由于有时间限制,因此我们不能遍历所有版本比较,那我们只能使用二分查找,也是双指针的一个用法,双指针在我看来的主要目的就是缩小计算区间。直到区间为1返回答案。
比如[1,2,3,4,5] 输入错误版本为4,我们有left和right,分别指向1和5,计算中间值为3,3如果是错误版本,说明3之后肯定都是错误版本,那3之前有没有错误版本呢?所以我们吧right指向3,计算中间值为2,如果2不是错误版本,说明错误版本在2之后,于是,我们调整left指针加1,到2,计算中间是2,2不是错误版本,left加1到3,返回答案。
解题思路
- 确定操作对象:本题中,操作对象1个n
- 确定操作条件:操作条件只要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;
int right=n;
int mid;
while(left<right){
mid = left+(right-left)/2;
if(isBadVersion(mid)){
right =mid;
}else{
left=mid+1;
}
}
return right;
}
}
总结
这是一道简单题目,我觉得题目本身不是很难,关键是一些隐藏的信息,比如版本迭代,当前版本如果是错误版本,那之后的肯定也是错误的,这个是一个隐藏的信息,所以我们要善于发现,才能找到解决思路。