Hone logo
Hone
Problems

Find the First Bad Version

Imagine you're testing a large number of software versions. You know that after a certain version, all subsequent versions are "bad." Your task is to efficiently determine the first bad version using a binary search approach, given a function that can tell you if a version is bad. This problem is a classic example of how binary search can be applied to non-sorted data to optimize search efficiency.

Problem Description

You are given a sorted array of integers representing version numbers. You are also given a function isBadVersion(version) which returns whether version version is bad. You need to find the first bad version. The array is sorted such that versions before the first bad version are good, and all versions after are bad.

What needs to be achieved:

  • Implement a function that takes the total number of versions (n) as input.
  • Use binary search to find the smallest integer firstBad such that isBadVersion(firstBad) returns true.
  • Return the value of firstBad.

Key Requirements:

  • You cannot directly access the versions array. You must use the isBadVersion(version) function to determine if a version is bad.
  • The solution must be efficient, utilizing binary search to minimize the number of calls to isBadVersion.

Expected Behavior:

The function should return the index of the first bad version. If all versions are good, it should return n + 1 (or a value outside the valid range of versions, depending on the specific implementation).

Edge Cases to Consider:

  • n = 0: Handle the case where there are no versions.
  • isBadVersion(1) is true: The first version is bad.
  • isBadVersion(n) is false: All versions are good, so the first bad version is beyond n.
  • Large values of n: Ensure the binary search doesn't overflow.

Examples

Example 1:

Input: n = 5, isBadVersion(4) returns true
Output: 4
Explanation: The first bad version is version 4. Versions 1, 2, and 3 are good, while 4 and 5 are bad.

Example 2:

Input: n = 5, isBadVersion(1) returns true
Output: 1
Explanation: The first bad version is version 1.

Example 3:

Input: n = 5, isBadVersion(5) returns false
Output: 6
Explanation: All versions are good. The first bad version would be version 6 (which doesn't exist, so we return n+1).

Constraints

  • 1 <= n <= 2147483647 (The number of versions)
  • isBadVersion(version) is a pre-defined function that returns true if version is bad, and false otherwise. You do not need to implement this function.
  • The solution should have a time complexity of O(log n).

Notes

Think about how binary search works. You'll need to maintain a low and high pointer to define the search space. In each iteration, calculate the mid point and use isBadVersion(mid) to determine whether to search in the left or right half. Remember to adjust the low and high pointers accordingly. Consider how to handle the edge case where the first bad version is the very first version.

Loading editor...
plaintext