LeetCode -- First Bad Version

本文介绍了一个产品经理面临的挑战:如何高效地找到导致后续版本都出现问题的第一个故障版本。通过使用二分查找的方法并尽量减少调用API isBadVersion(version)的次数,可以有效地解决这一问题。

Quesion:

You are a product manager and currently leading a team to develop a new product. Unfortunately, the latest version of your product fails the quality check. Since each version is developed based on the previous version, all the versions after a bad version are also bad.

Suppose you have n versions [1, 2, ..., n] and you want to find out the first bad one, which causes all the following ones to be bad.

You are given an API bool isBadVersion(version) which will return whether version is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

 

Analysis:

题目大意是:假设你是一个生产商经理,当前正领导生产一批新的产品。但是不幸的是,你的最近一个版本的产品被检查出质量问题。因为每个版本的生产都会依赖前一个版本,因此一旦某个版本出现问题,它后面的所有版本都将出现问题。

假设你已经有n个版本[1,2,3,……,n],现在需要找出里面出错的第一个版本。你可以使用API isBadVersion(version)来检测某个版本是否有问题,但是要求尽可能的少使用这个API。

分析:这相当与一个二分查找的问题,每次从中间一个版本查起,若当前版本没问题,说明问题版本出现在后面一半中;若当前版本出现问题,说明第一个问题版本出现在前面一半中。一定要注意结束条件以及返回的数值。

 

Answer:

    public int firstBadVersion(int n) {
        if(n == 0)
                return 0;
        if(isBadVersion(1)) //若第一个版本有问题,则后面所有都有问题
                return 1;
        
        if(!isBadVersion(n)) //若最后一个版本都没有问题,说明所有都没有问题
            return Integer.MAX_VALUE;
        
        int left = 1, right = n;
        while(true) {
                int mid = left + (right - left) / 2; //注意直接用(left + right) 可能会超过Integer的最大的范围
                if(left == mid)
                    return right;
                else {
                    if(isBadVersion(mid) == true) {
                        right = mid;
                    } else {
                        left = mid;
                    }
                }
        }
    }

 

转载于:https://www.cnblogs.com/little-YTMM/p/4813435.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值