面向小白的力扣278. 第一个错误的版本-双指针玩法

106 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第3天,点击查看活动详情

今天,我们继续搞算法。

题目描述

你是产品经理,目前正在带领一个团队开发新的产品。不幸的是,你的产品的最新版本没有通过质量检测。由于每个版本都是基于之前的版本开发的,所以错误的版本之后的所有版本都是错的。

假设你有 n 个版本 [1, 2, ..., n],你想找出导致之后所有版本出错的第一个错误的版本。

你可以通过调用 bool isBadVersion(version) 接口来判断版本号 version 是否在单元测试中出错。实现一个函数来查找第一个错误的版本。你应该尽量减少对调用 API 的次数。

image.png

题目分析

这个题目是让我们查找一个坏的版本,由于有时间限制,因此我们不能遍历所有版本比较,那我们只能使用二分查找,也是双指针的一个用法,双指针在我看来的主要目的就是缩小计算区间。直到区间为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;
    }
}

总结

这是一道简单题目,我觉得题目本身不是很难,关键是一些隐藏的信息,比如版本迭代,当前版本如果是错误版本,那之后的肯定也是错误的,这个是一个隐藏的信息,所以我们要善于发现,才能找到解决思路。