278. First Bad Version (Easy)

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 havenversions[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 APIbool isBadVersion(version)which will return whetherversionis bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.

Solution 1: Binary Search O(log n); O(1)

这种写法API调用最少,但是要问:Can I assume that there must exist a bad version so that I don't need to handle the case that all versions are good?

    public int firstBadVersion(int n) {
        int start = 1;
        int end = n;
        while (start < end) {
            int mid = start + (end - start) / 2;
            if (isBadVersion(mid)) {
                end = mid; //mid can be the first bad version
            } else {
                start = mid + 1; //mid version is good so we can exclude it.
            }
        }
        return start;
    }
Solution 2: Binary Search O(log n); O(1)

如果有全是good version的case,必须这么写了。

    public int firstBadVersion(int n) {
        int start = 1;
        int end = n;
        while (start < end) {
            int mid = start + (end - start) / 2;
            if (isBadVersion(mid)) {
                end = mid;
            } else {
                start = mid + 1;
            }
        }
        if (isBadVersion(start)) {
            return start;
        }
        return -1;
    }
Solution 3: Binary Search O(log n); O(1) 九章二分模板,这题不推荐用
    public int firstBadVersion(int n) {
        int start = 1;
        int end = n;
        while (start + 1 < end) {
            int mid = start + (end - start) / 2;
            if (isBadVersion(mid)) {
                end = mid;
            } else {
                start = mid;
            }
        }
        if (isBadVersion(start)) {
            return start;
        }
        if (isBadVersion(end)) {
            return end;
        }
        return -1;
    }
Follow Up:

1.多加了一个 转化时间到产品代号的api, 具体我也说不清楚,反正核心算法就是binary search

bad version 那道题他变种的面目全非了,直接导致我做这道题用了20分钟。。。。

2.如果有k台机器,如何parallel (博士的面经)
这个题没让写代码,就说了一下思路,我回答的大概就是把区间分成k+1份,然后这样就要K个分割点让K台机器并行的调用isBad()函数,然后遍历得到的结果,会有一个点i和其相邻点(i+1)的结果不一样,这样就把区间范围缩小到(i, i+1),重复之前的过程知道找到为止。小哥说ok也没再继续问

results matching ""

    No results matching ""