2022-07-09 10:02:11 +08:00
# Leetcode First-Bad-Version
#### 2022-07-09 09:52
> ##### Algorithms:
2022-09-03 15:41:36 +08:00
>
> #algorithm #binary_search
>
2022-07-09 10:02:11 +08:00
> ##### Data structures:
2022-09-03 15:41:36 +08:00
>
> #DS #array
>
2022-07-09 10:02:11 +08:00
> ##### Difficulty:
2022-09-03 15:41:36 +08:00
>
2022-09-06 20:22:48 +08:00
> #coding_problem #difficulty_easy
2022-09-03 15:41:36 +08:00
>
2022-07-09 10:02:11 +08:00
> ##### Additional tags:
2022-09-03 15:41:36 +08:00
>
2022-07-09 10:02:11 +08:00
> #leetcode
2022-09-03 15:41:36 +08:00
>
2022-07-09 10:02:11 +08:00
> ##### Revisions:
2022-09-03 15:41:36 +08:00
>
2022-07-09 10:02:11 +08:00
> N/A
##### Related topics:
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
##### Links:
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
- [Link to problem ](https://leetcode.com/problems/first-bad-version/ )
2022-09-03 15:41:36 +08:00
---
2022-07-09 10:02:11 +08:00
### Problem
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 have `n` versions `[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 API `bool isBadVersion(version)` which returns whether `version` is bad. Implement a function to find the first bad version. You should minimize the number of calls to the API.
#### Examples
**Example 1:**
**Input:** n = 5, bad = 4
**Output:** 4
**Explanation:**
call isBadVersion(3) -> false
call isBadVersion(5) -> true
call isBadVersion(4) -> true
Then 4 is the first bad version.
**Example 2:**
**Input:** n = 1, bad = 1
**Output:** 1
#### Constraints
2022-09-03 15:41:36 +08:00
- `1 <= bad <= n <= 231 - 1`
2022-07-09 10:02:11 +08:00
### Thoughts
> [!summary]
> This is a #binary_search problem
2022-09-03 15:41:36 +08:00
Note that [[Leetcode First-Bad-Version#Constraints]], n can be 2\*\*31, which means there might be integer overflow.
2022-07-09 10:02:11 +08:00
To address that, according to [[Binary Search Algorithm#How to implement Binary search]], use `mid = l + (r - l) / 2`
2022-09-03 15:41:36 +08:00
In my first iteration,
2022-07-09 10:02:11 +08:00
I use a `first` variable to keep track of the first bad version.
2022-07-09 10:15:12 +08:00
Later I realized that by the definition of Bi-search, left boundary will converge to the first one.
2022-07-09 10:02:11 +08:00
### Solution
2022-07-09 10:15:12 +08:00
Second version, 0ms
2022-09-03 15:41:36 +08:00
2022-07-09 10:15:12 +08:00
```cpp
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
// variant of BS
// 1-indexed
2022-09-03 15:41:36 +08:00
2022-07-09 10:15:12 +08:00
int r = n;
int l = 1;
int mid;
2022-09-03 15:41:36 +08:00
2022-07-09 10:15:12 +08:00
do {
mid = l + (r - l) / 2;
2022-09-03 15:41:36 +08:00
2022-07-09 10:15:12 +08:00
if (isBadVersion(mid)) {
// Search left
r = mid - 1;
} else {
l = mid + 1;
}
} while (l < = r);
2022-09-03 15:41:36 +08:00
2022-07-09 10:15:12 +08:00
return l;
}
};
```
First iteration, 4ms
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
```cpp
// The API isBadVersion is defined for you.
// bool isBadVersion(int version);
class Solution {
public:
int firstBadVersion(int n) {
// variant of BS
// 1-indexed
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
int r = n;
int l = 1;
int mid;
int first = n;
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
do {
mid = l + (r - l) / 2;
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
if (isBadVersion(mid)) {
first = min(n, mid);
// Search left
r = mid - 1;
} else {
l = mid + 1;
}
} while (l < = r);
2022-09-03 15:41:36 +08:00
2022-07-09 10:02:11 +08:00
return first;
}
};
2022-09-03 15:41:36 +08:00
```