carloscn / structstudy

Leetcode daily trainning by using C/C++/RUST programming.
4 stars 1 forks source link

leetcode278:第一个错误的版本(first-bad-version) #73

Open carloscn opened 1 year ago

carloscn commented 1 year ago

问题描述:

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

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

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

示例 1: 输入:n = 5, bad = 4 输出:4 解释: 调用 isBadVersion(3) -> false 调用 isBadVersion(5) -> true 调用 isBadVersion(4) -> true 所以,4 是第一个错误的版本。

示例 2: 输入:n = 1, bad = 1 输出:1   提示:

来源:力扣(LeetCode) 链接:https://leetcode.cn/problems/first-bad-version

carloscn commented 1 year ago

问题分析

二分法查找的变种:

static uint64_t glb_bad_version = 0;

static inline bool is_bad_version(uint64_t val)
{
    return val >= glb_bad_version;
}

static int32_t first_bad_version(const uint64_t *array, size_t n, uint64_t bad_version, uint64_t *result)
{
    int32_t ret = 0;
    uint64_t left = 0;
    uint64_t right = n - 1;
    uint64_t mid = 0;

    UTILS_CHECK_LEN(n);
    UTILS_CHECK_PTR(array);
    UTILS_CHECK_PTR(result);

    glb_bad_version = bad_version;

    while (left <= right) {
        mid = left + (right - left) / 2;
        if (is_bad_version(mid))
            right = mid - 1;
        else
            left = mid + 1;
    }

    *result = left;

finish:
    return ret;
}
carloscn commented 1 year ago

code:

https://github.com/carloscn/structstudy/blob/master/c_programming/array/26_first-bad-version_278.c

result:

image