@@ -52,16 +52,16 @@ tags:
52
52
53
53
### 方法一:二分查找
54
54
55
- 我们定义二分查找的左边界 $left =0$,右边界 $right =n-1$。
55
+ 我们定义二分查找的左边界 $l =0$,右边界 $r =n-1$。
56
56
57
- 每一次循环,我们计算中间位置 $mid=(left+right )/2$,然后判断 $ nums[ mid] $ 和 $target$ 的大小关系:
57
+ 每一次循环,我们计算中间位置 $\text{ mid}=(l+r )/2$,然后比较 $\text{ nums} [ \text{ mid} ] $ 和 $\text{ target}$ 的大小。
58
58
59
- - 如果 $nums[ mid] \geq target$,则说明 $ target$ 在 $ [ left, mid ] $ 之间,我们将 $right$ 更新为 $ mid$;
60
- - 否则,说明 $target$ 在 $ [ mid+1, right ] $ 之间,我们将 $left$ 更新为 $ mid+1$。
59
+ - 如果 $\text{ nums} [ \text{ mid} ] \geq \text{ target}$,说明 $\text{ target}$ 在左半部分,我们将右边界 $r$ 移动到 $\text{ mid} $;
60
+ - 否则,说明 $\text{ target}$ 在右半部分,我们将左边界 $l$ 移动到 $\text{ mid} +1$。
61
61
62
- 当 $left \geq right$ 时,我们判断 $ nums[ left ] $ 是否等于 $ target$,如果等于则返回 $left $,否则返回 $-1$。
62
+ 循环结束的条件是 $l<r$,此时 $\text{ nums} [ l ] $ 就是我们要找的目标值,如果 $\text{nums} [ l ] =\text{ target}$,返回 $l $,否则返回 $-1$。
63
63
64
- 时间复杂度 $O(\log n)$,其中 $n$ 是数组 $nums$ 的长度。空间复杂度 $O(1)$。
64
+ 时间复杂度 $O(\log n)$,其中 $n$ 是数组 $\text{ nums} $ 的长度。空间复杂度 $O(1)$。
65
65
66
66
<!-- tabs:start -->
67
67
@@ -70,31 +70,31 @@ tags:
70
70
``` python
71
71
class Solution :
72
72
def search (self , nums : List[int ], target : int ) -> int :
73
- left, right = 0 , len (nums) - 1
74
- while left < right :
75
- mid = (left + right ) >> 1
73
+ l, r = 0 , len (nums) - 1
74
+ while l < r :
75
+ mid = (l + r ) >> 1
76
76
if nums[mid] >= target:
77
- right = mid
77
+ r = mid
78
78
else :
79
- left = mid + 1
80
- return left if nums[left ] == target else - 1
79
+ l = mid + 1
80
+ return l if nums[l ] == target else - 1
81
81
```
82
82
83
83
#### Java
84
84
85
85
``` java
86
86
class Solution {
87
87
public int search (int [] nums , int target ) {
88
- int left = 0 , right = nums. length - 1 ;
89
- while (left < right ) {
90
- int mid = (left + right ) >> 1 ;
88
+ int l = 0 , r = nums. length - 1 ;
89
+ while (l < r ) {
90
+ int mid = (l + r ) >> 1 ;
91
91
if (nums[mid] >= target) {
92
- right = mid;
92
+ r = mid;
93
93
} else {
94
- left = mid + 1 ;
94
+ l = mid + 1 ;
95
95
}
96
96
}
97
- return nums[left ] == target ? left : - 1 ;
97
+ return nums[l ] == target ? l : - 1 ;
98
98
}
99
99
}
100
100
```
@@ -105,15 +105,16 @@ class Solution {
105
105
class Solution {
106
106
public:
107
107
int search(vector<int >& nums, int target) {
108
- int left = 0, right = nums.size() - 1;
109
- while (left < right) {
110
- int mid = left + right >> 1;
111
- if (nums[ mid] >= target)
112
- right = mid;
113
- else
114
- left = mid + 1;
108
+ int l = 0, r = nums.size() - 1;
109
+ while (l < r) {
110
+ int mid = (l + r) >> 1;
111
+ if (nums[ mid] >= target) {
112
+ r = mid;
113
+ } else {
114
+ l = mid + 1;
115
+ }
115
116
}
116
- return nums[ left ] == target ? left : -1;
117
+ return nums[ l ] == target ? l : -1;
117
118
}
118
119
};
119
120
```
@@ -122,46 +123,59 @@ public:
122
123
123
124
```go
124
125
func search(nums []int, target int) int {
125
- left, right := 0, len(nums)-1
126
- for left < right {
127
- mid := (left + right ) >> 1
126
+ l, r := 0, len(nums)-1
127
+ for l < r {
128
+ mid := (l + r ) >> 1
128
129
if nums[mid] >= target {
129
- right = mid
130
+ r = mid
130
131
} else {
131
- left = mid + 1
132
+ l = mid + 1
132
133
}
133
134
}
134
- if nums[left ] == target {
135
- return left
135
+ if nums[l ] == target {
136
+ return l
136
137
}
137
138
return -1
138
139
}
139
140
```
140
141
142
+ #### TypeScript
143
+
144
+ ``` ts
145
+ function search(nums : number [], target : number ): number {
146
+ let [l, r] = [0 , nums .length - 1 ];
147
+ while (l < r ) {
148
+ const mid = (l + r ) >> 1 ;
149
+ if (nums [mid ] >= target ) {
150
+ r = mid ;
151
+ } else {
152
+ l = mid + 1 ;
153
+ }
154
+ }
155
+ return nums [l ] === target ? l : - 1 ;
156
+ }
157
+ ```
158
+
141
159
#### Rust
142
160
143
161
``` rust
144
- use std :: cmp :: Ordering ;
145
-
146
162
impl Solution {
147
163
pub fn search (nums : Vec <i32 >, target : i32 ) -> i32 {
148
- let mut l = 0 ;
149
- let mut r = nums . len ();
164
+ let mut l : usize = 0 ;
165
+ let mut r : usize = nums . len () - 1 ;
150
166
while l < r {
151
167
let mid = (l + r ) >> 1 ;
152
- match nums [mid ]. cmp (& target ) {
153
- Ordering :: Less => {
154
- l = mid + 1 ;
155
- }
156
- Ordering :: Greater => {
157
- r = mid ;
158
- }
159
- Ordering :: Equal => {
160
- return mid as i32 ;
161
- }
168
+ if nums [mid ] >= target {
169
+ r = mid ;
170
+ } else {
171
+ l = mid + 1 ;
162
172
}
163
173
}
164
- - 1
174
+ if nums [l ] == target {
175
+ l as i32
176
+ } else {
177
+ - 1
178
+ }
165
179
}
166
180
}
167
181
```
@@ -175,17 +189,16 @@ impl Solution {
175
189
* @return {number}
176
190
*/
177
191
var search = function (nums , target ) {
178
- let left = 0 ;
179
- let right = nums .length - 1 ;
180
- while (left < right) {
181
- const mid = (left + right) >> 1 ;
192
+ let [l, r] = [0 , nums .length - 1 ];
193
+ while (l < r) {
194
+ const mid = (l + r) >> 1 ;
182
195
if (nums[mid] >= target) {
183
- right = mid;
196
+ r = mid;
184
197
} else {
185
- left = mid + 1 ;
198
+ l = mid + 1 ;
186
199
}
187
200
}
188
- return nums[left ] == target ? left : - 1 ;
201
+ return nums[l ] === target ? l : - 1 ;
189
202
};
190
203
```
191
204
@@ -194,16 +207,16 @@ var search = function (nums, target) {
194
207
``` cs
195
208
public class Solution {
196
209
public int Search (int [] nums , int target ) {
197
- int left = 0 , right = nums .Length - 1 ;
198
- while (left < right ) {
199
- int mid = (left + right ) >> 1 ;
210
+ int l = 0 , r = nums .Length - 1 ;
211
+ while (l < r ) {
212
+ int mid = (l + r ) >> 1 ;
200
213
if (nums [mid ] >= target ) {
201
- right = mid ;
214
+ r = mid ;
202
215
} else {
203
- left = mid + 1 ;
216
+ l = mid + 1 ;
204
217
}
205
218
}
206
- return nums [left ] == target ? left : - 1 ;
219
+ return nums [l ] == target ? l : - 1 ;
207
220
}
208
221
}
209
222
```
0 commit comments