diff --git a/solution/0200-0299/0278.First Bad Version/README.md b/solution/0200-0299/0278.First Bad Version/README.md
index 19c1f9bc17397..f2035b6f2a3cd 100644
--- a/solution/0200-0299/0278.First Bad Version/README.md
+++ b/solution/0200-0299/0278.First Bad Version/README.md
@@ -30,8 +30,8 @@ tags:
输入:n = 5, bad = 4
输出:4
解释:
-调用 isBadVersion(3) -> false
-调用 isBadVersion(5) -> true
+调用 isBadVersion(3) -> false
+调用 isBadVersion(5) -> true
调用 isBadVersion(4) -> true
所以,4 是第一个错误的版本。
@@ -57,7 +57,15 @@ tags:
-### 方法一
+### 方法一:二分查找
+
+我们定义二分查找的左边界 $l = 1$,右边界 $r = n$。
+
+当 $l < r$ 时,我们计算中间位置 $\textit{mid} = \left\lfloor \frac{l + r}{2} \right\rfloor$,然后调用 `isBadVersion(mid)` 接口,如果返回 $\textit{true}$,则说明第一个错误的版本在 $[l, \textit{mid}]$ 之间,我们令 $r = \textit{mid}$;否则第一个错误的版本在 $[\textit{mid} + 1, r]$ 之间,我们令 $l = \textit{mid} + 1$。
+
+最终返回 $l$ 即可。
+
+时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。
@@ -65,25 +73,19 @@ tags:
```python
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
```
#### Java
@@ -94,16 +96,16 @@ class Solution:
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
}
```
@@ -117,16 +119,16 @@ public class Solution extends VersionControl {
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
};
```
@@ -143,19 +145,45 @@ public:
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
+ return l
}
```
+#### TypeScript
+
+```ts
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};
+```
+
#### Rust
```rust
@@ -165,17 +193,16 @@ func firstBadVersion(n int) int {
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
```
@@ -203,17 +230,16 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
```
diff --git a/solution/0200-0299/0278.First Bad Version/README_EN.md b/solution/0200-0299/0278.First Bad Version/README_EN.md
index 5608efe4d2f33..45c6becbac802 100644
--- a/solution/0200-0299/0278.First Bad Version/README_EN.md
+++ b/solution/0200-0299/0278.First Bad Version/README_EN.md
@@ -56,7 +56,15 @@ Then 4 is the first bad version.
-### Solution 1
+### Solution 1: Binary Search
+
+We define the left boundary of the binary search as $l = 1$ and the right boundary as $r = n$.
+
+While $l < r$, we calculate the middle position $\textit{mid} = \left\lfloor \frac{l + r}{2} \right\rfloor$, then call the `isBadVersion(mid)` API. If it returns $\textit{true}$, it means the first bad version is between $[l, \textit{mid}]$, so we set $r = \textit{mid}$; otherwise, the first bad version is between $[\textit{mid} + 1, r]$, so we set $l = \textit{mid} + 1$.
+
+Finally, we return $l$.
+
+The time complexity is $O(\log n)$, and the space complexity is $O(1)$.
@@ -64,25 +72,19 @@ Then 4 is the first bad version.
```python
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
```
#### Java
@@ -93,16 +95,16 @@ class Solution:
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
}
```
@@ -116,16 +118,16 @@ public class Solution extends VersionControl {
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
};
```
@@ -142,19 +144,45 @@ public:
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
+ return l
}
```
+#### TypeScript
+
+```ts
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};
+```
+
#### Rust
```rust
@@ -164,17 +192,16 @@ func firstBadVersion(n int) int {
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
```
@@ -202,17 +229,16 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
```
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.cpp b/solution/0200-0299/0278.First Bad Version/Solution.cpp
index 975f5fdb508dd..5536140dafb6b 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.cpp
+++ b/solution/0200-0299/0278.First Bad Version/Solution.cpp
@@ -4,15 +4,15 @@
class Solution {
public:
int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = left + ((right - left) >> 1);
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = l + (r - l) / 2;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
-};
\ No newline at end of file
+};
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.go b/solution/0200-0299/0278.First Bad Version/Solution.go
index 6cfe9c4ee4c50..579b225670465 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.go
+++ b/solution/0200-0299/0278.First Bad Version/Solution.go
@@ -7,14 +7,14 @@
*/
func firstBadVersion(n int) int {
- left, right := 1, n
- for left < right {
- mid := (left + right) >> 1
+ l, r := 1, n
+ for l < r {
+ mid := (l + r) >> 1
if isBadVersion(mid) {
- right = mid
+ r = mid
} else {
- left = mid + 1
+ l = mid + 1
}
}
- return left
-}
\ No newline at end of file
+ return l
+}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.java b/solution/0200-0299/0278.First Bad Version/Solution.java
index 5039dd4fb8a95..a205ba020c22c 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.java
+++ b/solution/0200-0299/0278.First Bad Version/Solution.java
@@ -3,15 +3,15 @@
public class Solution extends VersionControl {
public int firstBadVersion(int n) {
- int left = 1, right = n;
- while (left < right) {
- int mid = (left + right) >>> 1;
+ int l = 1, r = n;
+ while (l < r) {
+ int mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
}
-}
\ No newline at end of file
+}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.js b/solution/0200-0299/0278.First Bad Version/Solution.js
index 9258a94af6da2..76b3b3dcc548d 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.js
+++ b/solution/0200-0299/0278.First Bad Version/Solution.js
@@ -18,16 +18,15 @@ var solution = function (isBadVersion) {
* @return {integer} The first bad version
*/
return function (n) {
- let left = 1;
- let right = n;
- while (left < right) {
- const mid = (left + right) >>> 1;
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
if (isBadVersion(mid)) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- return left;
+ return l;
};
};
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.py b/solution/0200-0299/0278.First Bad Version/Solution.py
index 8f00dbe67f9cf..74ed74886e2c1 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.py
+++ b/solution/0200-0299/0278.First Bad Version/Solution.py
@@ -1,20 +1,14 @@
# The isBadVersion API is already defined for you.
-# @param version, an integer
-# @return an integer
-# def isBadVersion(version):
+# def isBadVersion(version: int) -> bool:
class Solution:
- def firstBadVersion(self, n):
- """
- :type n: int
- :rtype: int
- """
- left, right = 1, n
- while left < right:
- mid = (left + right) >> 1
+ def firstBadVersion(self, n: int) -> int:
+ l, r = 1, n
+ while l < r:
+ mid = (l + r) >> 1
if isBadVersion(mid):
- right = mid
+ r = mid
else:
- left = mid + 1
- return left
+ l = mid + 1
+ return l
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.rs b/solution/0200-0299/0278.First Bad Version/Solution.rs
index 42411a4e2a095..97fc16ce989d7 100644
--- a/solution/0200-0299/0278.First Bad Version/Solution.rs
+++ b/solution/0200-0299/0278.First Bad Version/Solution.rs
@@ -4,16 +4,15 @@
impl Solution {
pub fn first_bad_version(&self, n: i32) -> i32 {
- let mut left = 1;
- let mut right = n;
- while left < right {
- let mid = left + (right - left) / 2;
+ let (mut l, mut r) = (1, n);
+ while l < r {
+ let mid = l + (r - l) / 2;
if self.isBadVersion(mid) {
- right = mid;
+ r = mid;
} else {
- left = mid + 1;
+ l = mid + 1;
}
}
- left
+ l
}
}
diff --git a/solution/0200-0299/0278.First Bad Version/Solution.ts b/solution/0200-0299/0278.First Bad Version/Solution.ts
new file mode 100644
index 0000000000000..6a6001924f16d
--- /dev/null
+++ b/solution/0200-0299/0278.First Bad Version/Solution.ts
@@ -0,0 +1,21 @@
+/**
+ * The knows API is defined in the parent class Relation.
+ * isBadVersion(version: number): boolean {
+ * ...
+ * };
+ */
+
+var solution = function (isBadVersion: any) {
+ return function (n: number): number {
+ let [l, r] = [1, n];
+ while (l < r) {
+ const mid = (l + r) >>> 1;
+ if (isBadVersion(mid)) {
+ r = mid;
+ } else {
+ l = mid + 1;
+ }
+ }
+ return l;
+ };
+};