【算法题解】67. 第一个错误的版本

这是一道 「简单」
https://leetcode.cn/problems/first-bad-version/

题目

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

假设你有 个版本 ,你想找出导致之后所有版本出错的第一个错误的版本。

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

示例 1:

输入:n = 5, bad = 4
输出:4
解释:
调用 isBadVersion(3) -> false 
调用 isBadVersion(5) -> true 
调用 isBadVersion(4) -> true

所以,4 是第一个错误的版本。

示例 2:

输入:n = 1, bad = 1
输出:1

提示:

题解

这是一道典型的 「二分查找」 的题目,满足其所有的条件:

  1. 目标函数(或者说待查找的序列)具有「单调性」。第一个错误版本及其之后的版本都是错的,前面的版本都是对的。
  2. 「具有边界」。最小的版本是 ,最大的版本是
  3. 可以「通过索引进行访问」。通过 检查即相当于通过索引访问。

解题思路比较简单,定义左右边界分别为 ,然后取中间版本

  • 如果版本 是错误版本,那么丢弃 后面所有的版本,即 ,因为它们肯定不会是第一个错误版本。
  • 如果版本 是正确版本,那么丢弃 以及其前面所有的版本,即 ,因为他们肯定都是正确版本,也就不会是第一个错误版本了。

直到当 的时候,这个版本就是第一个错误版本。

代码实现

Java

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;
        
    }
}

Go

func firstBadVersion(n int) int {
    left, right := 1, n

    for left < right {
        mid := left + (right - left) / 2
        if isBadVersion(mid) {
            right = mid
        }else {
            left = mid + 1
        }
    }

    return left
}

复杂度分析

时间复杂度

空间复杂度

– End –

【算法题解】67. 第一个错误的版本


如果觉得有所收获,就顺道点个关注吧!【算法题解】67. 第一个错误的版本


原文始发于微信公众号(i余数):【算法题解】67. 第一个错误的版本

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/193530.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!