First Bad Version

easy binary search interactive

Problem

You're given an API isBadVersion(v) that returns true once and forever once the build broke. Among versions 1..n, return the first bad version while making as few API calls as possible.

Inputn = 8, first bad = 5
Output5
isBadVersion goes false, false, false, false, true, true, true, true — bisect for the boundary.

def firstBadVersion(n):
    lo, hi = 1, n
    while lo < hi:
        mid = lo + (hi - lo) // 2
        if isBadVersion(mid):
            hi = mid
        else:
            lo = mid + 1
    return lo
var solution = function (isBadVersion) {
  return function (n) {
    let lo = 1, hi = n;
    while (lo < hi) {
      const mid = lo + ((hi - lo) >> 1);
      if (isBadVersion(mid)) hi = mid;
      else lo = mid + 1;
    }
    return lo;
  };
};
public class Solution extends VersionControl {
    public int firstBadVersion(int n) {
        int lo = 1, hi = n;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (isBadVersion(mid)) hi = mid;
            else lo = mid + 1;
        }
        return lo;
    }
}
class Solution {
public:
    int firstBadVersion(int n) {
        int lo = 1, hi = n;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (isBadVersion(mid)) hi = mid;
            else lo = mid + 1;
        }
        return lo;
    }
};
Time: O(log n) Space: O(1)