30
30
<strong >输入:</strong >n = 5, bad = 4
31
31
<strong >输出:</strong >4
32
32
<strong >解释:</strong >
33
- <code >调用 isBadVersion(3) -> ; false
34
- 调用 isBadVersion(5)  ; -> ; true
33
+ <code >调用 isBadVersion(3) -> ; false
34
+ 调用 isBadVersion(5)  ; -> ; true
35
35
调用 isBadVersion(4)  ; -> ; true</code >
36
36
<code >所以,4 是第一个错误的版本。</code >
37
37
</pre >
@@ -57,33 +57,35 @@ tags:
57
57
58
58
<!-- solution:start -->
59
59
60
- ### 方法一
60
+ ### 方法一:二分查找
61
+
62
+ 我们定义二分查找的左边界 $l = 1$,右边界 $r = n$。
63
+
64
+ 当 $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$。
65
+
66
+ 最终返回 $l$ 即可。
67
+
68
+ 时间复杂度 $O(\log n)$,空间复杂度 $O(1)$。
61
69
62
70
<!-- tabs:start -->
63
71
64
72
#### Python3
65
73
66
74
``` python
67
75
# The isBadVersion API is already defined for you.
68
- # @param version, an integer
69
- # @return an integer
70
- # def isBadVersion(version):
76
+ # def isBadVersion(version: int) -> bool:
71
77
72
78
73
79
class Solution :
74
- def firstBadVersion (self , n ):
75
- """
76
- :type n: int
77
- :rtype: int
78
- """
79
- left, right = 1 , n
80
- while left < right:
81
- mid = (left + right) >> 1
80
+ def firstBadVersion (self , n : int ) -> int :
81
+ l, r = 1 , n
82
+ while l < r:
83
+ mid = (l + r) >> 1
82
84
if isBadVersion(mid):
83
- right = mid
85
+ r = mid
84
86
else :
85
- left = mid + 1
86
- return left
87
+ l = mid + 1
88
+ return l
87
89
```
88
90
89
91
#### Java
@@ -94,16 +96,16 @@ class Solution:
94
96
95
97
public class Solution extends VersionControl {
96
98
public int firstBadVersion (int n ) {
97
- int left = 1 , right = n;
98
- while (left < right ) {
99
- int mid = (left + right ) >>> 1 ;
99
+ int l = 1 , r = n;
100
+ while (l < r ) {
101
+ int mid = (l + r ) >>> 1 ;
100
102
if (isBadVersion(mid)) {
101
- right = mid;
103
+ r = mid;
102
104
} else {
103
- left = mid + 1 ;
105
+ l = mid + 1 ;
104
106
}
105
107
}
106
- return left ;
108
+ return l ;
107
109
}
108
110
}
109
111
```
@@ -117,16 +119,16 @@ public class Solution extends VersionControl {
117
119
class Solution {
118
120
public:
119
121
int firstBadVersion(int n) {
120
- int left = 1, right = n;
121
- while (left < right ) {
122
- int mid = left + ((right - left) >> 1) ;
122
+ int l = 1, r = n;
123
+ while (l < r ) {
124
+ int mid = l + (r - l) / 2 ;
123
125
if (isBadVersion(mid)) {
124
- right = mid;
126
+ r = mid;
125
127
} else {
126
- left = mid + 1;
128
+ l = mid + 1;
127
129
}
128
130
}
129
- return left ;
131
+ return l ;
130
132
}
131
133
};
132
134
```
@@ -143,19 +145,45 @@ public:
143
145
*/
144
146
145
147
func firstBadVersion(n int) int {
146
- left, right := 1, n
147
- for left < right {
148
- mid := (left + right ) >> 1
148
+ l, r := 1, n
149
+ for l < r {
150
+ mid := (l + r ) >> 1
149
151
if isBadVersion(mid) {
150
- right = mid
152
+ r = mid
151
153
} else {
152
- left = mid + 1
154
+ l = mid + 1
153
155
}
154
156
}
155
- return left
157
+ return l
156
158
}
157
159
```
158
160
161
+ #### TypeScript
162
+
163
+ ``` ts
164
+ /**
165
+ * The knows API is defined in the parent class Relation.
166
+ * isBadVersion(version: number): boolean {
167
+ * ...
168
+ * };
169
+ */
170
+
171
+ var solution = function (isBadVersion : any ) {
172
+ return function (n : number ): number {
173
+ let [l, r] = [1 , n ];
174
+ while (l < r ) {
175
+ const mid = (l + r ) >>> 1 ;
176
+ if (isBadVersion (mid )) {
177
+ r = mid ;
178
+ } else {
179
+ l = mid + 1 ;
180
+ }
181
+ }
182
+ return l ;
183
+ };
184
+ };
185
+ ```
186
+
159
187
#### Rust
160
188
161
189
``` rust
@@ -165,17 +193,16 @@ func firstBadVersion(n int) int {
165
193
166
194
impl Solution {
167
195
pub fn first_bad_version (& self , n : i32 ) -> i32 {
168
- let mut left = 1 ;
169
- let mut right = n ;
170
- while left < right {
171
- let mid = left + (right - left ) / 2 ;
196
+ let (mut l , mut r ) = (1 , n );
197
+ while l < r {
198
+ let mid = l + (r - l ) / 2 ;
172
199
if self . isBadVersion (mid ) {
173
- right = mid ;
200
+ r = mid ;
174
201
} else {
175
- left = mid + 1 ;
202
+ l = mid + 1 ;
176
203
}
177
204
}
178
- left
205
+ l
179
206
}
180
207
}
181
208
```
@@ -203,17 +230,16 @@ var solution = function (isBadVersion) {
203
230
* @return {integer} The first bad version
204
231
*/
205
232
return function (n ) {
206
- let left = 1 ;
207
- let right = n;
208
- while (left < right) {
209
- const mid = (left + right) >>> 1 ;
233
+ let [l, r] = [1 , n];
234
+ while (l < r) {
235
+ const mid = (l + r) >>> 1 ;
210
236
if (isBadVersion (mid)) {
211
- right = mid;
237
+ r = mid;
212
238
} else {
213
- left = mid + 1 ;
239
+ l = mid + 1 ;
214
240
}
215
241
}
216
- return left ;
242
+ return l ;
217
243
};
218
244
};
219
245
```
0 commit comments