1

LeetCode-278-第一个错误的版本

 2 years ago
source link: https://segmentfault.com/a/1190000040737328
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

LeetCode-278-第一个错误的版本

第一个错误的版本

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

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

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

示例说明请见LeetCode官网。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/probl...
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解法一:二分法

分别用low和high记录第一个元素和最后一个元素,然后用二分法求解,求解过程如下:

  • 用mid记录中间位置,即low + (high - low) / 2,然后调用isBadVersion(mid)方法判断当前版本是否是错误版本;
  • 如果当前版本是错误版本且当前版本前面的一个版本(需要再次调用isBadVersion方法)也是错误版本,则将high重置为mid-1,然后进行下一轮处理;
  • 如果当前版本是错误版本但是当前版本的前面一个版本不是错误版本,则当前版本即是第一个错误版本,返回当前版本;
  • 如果当前版本不是错误版本,则将low重置为mid+1,然后进行下一轮处理。
  • 循环终结的条件就是low大于high。

最后,如果没有找到错误的版本,返回-1。

public class LeetCode_278 extends VersionControl {
    /**
     * 二分法
     *
     * @param n
     * @return
     */
    public static int firstBadVersion(int n) {
        int low = 1, high = n;
        while (low <= high) {
            int mid = low + (high - low) / 2;
            if (isBadVersion(mid)) {
                if (mid > low && isBadVersion(mid - 1)) {
                    high = mid - 1;
                } else {
                    return mid;
                }
            } else {
                low = mid + 1;
            }
        }
        return -1;
    }

    public static void main(String[] args) {
        System.out.println(firstBadVersion(2126753390));
    }
}

class VersionControl {
    /**
     * 测试数据,前1702766718个版本都不是错误版本,从第1702766719个版本开始都是错误版本
     */
    public static boolean isBadVersion(int version) {
        if (version < 1702766719) {
            return false;
        } else {
            return true;
        }
    }
}

【每日寄语】 如果成功有捷径,那条路一定是坚持。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK