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; + }; +};