Versions 1..n are released in order and every version after a bad one is also bad. Using isBadVersion(v), find the first bad version with as few calls as possible. Here `bad` is the hidden first bad version.
Versions go good, good, …, bad, bad. Binary search for the first bad one: if mid is bad the answer is at or left of mid, otherwise it is right of mid.
1function solution(isBadVersion: (v: number) => boolean) {2return (n: number): number => {3let lo = 1, hi = n;4while (lo < hi) {5const mid = lo + ((hi - lo) >> 1);6if (isBadVersion(mid)) hi = mid;7else lo = mid + 1;8}9return lo;10};11}
The first bad version is somewhere in [1, 16].
Space: play/pause · ←/→: step