54
54
55
55
<!-- 这里可写通用的实现逻辑 -->
56
56
57
- 二分查找。
57
+ ** 方法一:二分查找**
58
+
59
+ 我们使用二分,将数组分割成 ` [left, mid] ` , ` [mid + 1, right] ` 两部分,这时候可以发现,其中有一部分一定是有序的。
60
+
61
+ 因此,我们可以根据有序的那一部分,判断 ` target ` 是否在这一部分中:
62
+
63
+ - 若 ` [0, mid] ` 范围内的元素构成有序数组:
64
+ - 若满足 ` nums[0] <= target <= nums[mid] ` ,那么我们搜索范围可以缩小为 ` [left, mid] ` ;
65
+ - 否则,在 ` [mid + 1, right] ` 中查找;
66
+ - 若 ` [mid + 1, n - 1] ` 范围内的元素构成有序数组:
67
+ - 若满足 ` nums[mid] < target <= nums[n - 1] ` ,那么我们搜索范围可以缩小为 ` [mid + 1, right] ` ;
68
+ - 否则,在 ` [left, mid] ` 中查找。
69
+
70
+ 二分查找终止条件是 ` l >= r ` ,若结束后发现 ` nums[left] ` 与 ` target ` 不等,说明数组中不存在值为 ` target ` 的元素,返回 -1,否则返回下标 left。
58
71
59
72
<!-- tabs:start -->
60
73
65
78
``` python
66
79
class Solution :
67
80
def search (self , nums : List[int ], target : int ) -> int :
68
- l, r = 0 , len (nums) - 1
69
- while l <= r:
70
- mid = (l + r) >> 1
71
- if nums[mid] == target:
72
- return mid
73
- if nums[mid] > target:
74
- if nums[mid] >= nums[r] and target < nums[l]:
75
- l = mid + 1
81
+ n = len (nums)
82
+ left, right = 0 , n - 1
83
+ while left < right:
84
+ mid = (left + right) >> 1
85
+ if nums[0 ] <= nums[mid]:
86
+ if nums[0 ] <= target and target <= nums[mid]:
87
+ right = mid
76
88
else :
77
- r = mid - 1
89
+ left = mid + 1
78
90
else :
79
- if nums[mid] <= nums[l] and target > nums[r ]:
80
- r = mid - 1
91
+ if nums[mid] < target and target <= nums[n - 1 ]:
92
+ left = mid + 1
81
93
else :
82
- l = mid + 1
83
- return - 1
94
+ right = mid
95
+ return left if nums[left] == target else - 1
84
96
```
85
97
86
98
### ** Java**
@@ -90,19 +102,25 @@ class Solution:
90
102
``` java
91
103
class Solution {
92
104
public int search (int [] nums , int target ) {
93
- int l = 0 , r = nums. length - 1 ;
94
- while (l <= r) {
95
- int mid = (l + r) >>> 1 ;
96
- if (nums[mid] == target) return mid;
97
- if (nums[mid] > target) {
98
- if (nums[mid] >= nums[r] && target < nums[l]) l = mid + 1 ;
99
- else r = mid - 1 ;
105
+ int n = nums. length;
106
+ int left = 0 , right = n - 1 ;
107
+ while (left < right) {
108
+ int mid = (left + right) >> 1 ;
109
+ if (nums[0 ] <= nums[mid]) {
110
+ if (nums[0 ] <= target && target <= nums[mid]) {
111
+ right = mid;
112
+ } else {
113
+ left = mid + 1 ;
114
+ }
100
115
} else {
101
- if (nums[mid] <= nums[l] && target > nums[r]) r = mid - 1 ;
102
- else l = mid + 1 ;
116
+ if (nums[mid] < target && target <= nums[n - 1 ]) {
117
+ left = mid + 1 ;
118
+ } else {
119
+ right = mid;
120
+ }
103
121
}
104
122
}
105
- return - 1 ;
123
+ return nums[left] == target ? left : - 1 ;
106
124
}
107
125
}
108
126
```
@@ -115,23 +133,56 @@ class Solution {
115
133
class Solution {
116
134
public:
117
135
int search(vector<int >& nums, int target) {
118
- int l = 0, r = nums.size() - 1;
119
- while (l <= r) {
120
- int mid = (l + r) >> 1;
121
- if (nums[ mid] == target) return mid;
122
- if (nums[ mid] > target) {
123
- if (nums[ mid] >= nums[ r] && target < nums[ l] ) l = mid + 1;
124
- else r = mid - 1;
125
- } else {
126
- if (nums[ mid] <= nums[ l] && target > nums[ r] ) r = mid - 1;
127
- else l = mid + 1;
136
+ int n = nums.size();
137
+ int left = 0, right = n - 1;
138
+ while (left < right)
139
+ {
140
+ int mid = (left + right) >> 1;
141
+ if (nums[ 0] <= nums[ mid] )
142
+ {
143
+ if (nums[ 0] <= target && target <= nums[ mid] ) right = mid;
144
+ else left = mid + 1;
145
+ }
146
+ else
147
+ {
148
+ if (nums[ mid] < target && target <= nums[ n - 1] ) left = mid + 1;
149
+ else right = mid;
128
150
}
129
151
}
130
- return -1;
152
+ return nums [ left ] == target ? left : -1;
131
153
}
132
154
};
133
155
```
134
156
157
+ ### **Go**
158
+
159
+ ```go
160
+ func search(nums []int, target int) int {
161
+ n := len(nums)
162
+ left, right := 0, n-1
163
+ for left < right {
164
+ mid := (left + right) >> 1
165
+ if nums[0] <= nums[mid] {
166
+ if nums[0] <= target && target <= nums[mid] {
167
+ right = mid
168
+ } else {
169
+ left = mid + 1
170
+ }
171
+ } else {
172
+ if nums[mid] < target && target <= nums[n-1] {
173
+ left = mid + 1
174
+ } else {
175
+ right = mid
176
+ }
177
+ }
178
+ }
179
+ if nums[left] == target {
180
+ return left
181
+ }
182
+ return -1
183
+ }
184
+ ```
185
+
135
186
### ** JavaScript**
136
187
137
188
``` js
@@ -141,29 +192,26 @@ public:
141
192
* @return {number}
142
193
*/
143
194
var search = function (nums , target ) {
144
- let l = 0,
145
- r = nums.length - 1;
146
- if (l > r) return -1;
147
- while (l <= r) {
148
- let mid = l + Math.floor((r - l) / 2);
149
- if (nums[mid] === target) return mid;
150
- else if (
151
- nums[mid] <= nums[r] &&
152
- target <= nums[r] &&
153
- target >= nums[mid]
154
- )
155
- l = mid + 1;
156
- else if (
157
- nums[mid] >= nums[l] &&
158
- target <= nums[mid] &&
159
- target >= nums[l]
160
- )
161
- r = mid - 1;
162
- else if (nums[mid] >= nums[r]) l = mid + 1;
163
- else if (nums[mid] <= nums[l]) r = mid - 1;
164
- else return -1;
195
+ const n = nums .length ;
196
+ let left = 0 ,
197
+ right = n - 1 ;
198
+ while (left < right) {
199
+ const mid = (left + right) >> 1 ;
200
+ if (nums[0 ] <= nums[mid]) {
201
+ if (nums[0 ] <= target && target <= nums[mid]) {
202
+ right = mid;
203
+ } else {
204
+ left = mid + 1 ;
205
+ }
206
+ } else {
207
+ if (nums[mid] < target && target <= nums[n - 1 ]) {
208
+ left = mid + 1 ;
209
+ } else {
210
+ right = mid;
211
+ }
212
+ }
165
213
}
166
- return -1;
214
+ return nums[left] == target ? left : - 1 ;
167
215
};
168
216
```
169
217
@@ -199,6 +247,33 @@ impl Solution {
199
247
}
200
248
```
201
249
250
+ ### ** TypeScript**
251
+
252
+ ``` ts
253
+ function search(nums : number [], target : number ): number {
254
+ const n = nums .length ;
255
+ let left = 0 ,
256
+ right = n - 1 ;
257
+ while (left < right ) {
258
+ const mid = (left + right ) >> 1 ;
259
+ if (nums [0 ] <= nums [mid ]) {
260
+ if (nums [0 ] <= target && target <= nums [mid ]) {
261
+ right = mid ;
262
+ } else {
263
+ left = mid + 1 ;
264
+ }
265
+ } else {
266
+ if (nums [mid ] < target && target <= nums [n - 1 ]) {
267
+ left = mid + 1 ;
268
+ } else {
269
+ right = mid ;
270
+ }
271
+ }
272
+ }
273
+ return nums [left ] == target ? left : - 1 ;
274
+ }
275
+ ```
276
+
202
277
### ** ...**
203
278
204
279
```
0 commit comments