Skip to content

Commit 87bc379

Browse files
committed
feat: add solutions to lc problem: No.0033
No.0033.Search in Rotated Sorted Array
1 parent 37aa93a commit 87bc379

File tree

8 files changed

+376
-196
lines changed

8 files changed

+376
-196
lines changed

solution/0000-0099/0033.Search in Rotated Sorted Array/README.md

+132-57
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,20 @@
5454

5555
<!-- 这里可写通用的实现逻辑 -->
5656

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。
5871

5972
<!-- tabs:start -->
6073

@@ -65,22 +78,21 @@
6578
```python
6679
class Solution:
6780
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
7688
else:
77-
r = mid - 1
89+
left = mid + 1
7890
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
8193
else:
82-
l = mid + 1
83-
return -1
94+
right = mid
95+
return left if nums[left] == target else -1
8496
```
8597

8698
### **Java**
@@ -90,19 +102,25 @@ class Solution:
90102
```java
91103
class Solution {
92104
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+
}
100115
} 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+
}
103121
}
104122
}
105-
return -1;
123+
return nums[left] == target ? left : -1;
106124
}
107125
}
108126
```
@@ -115,23 +133,56 @@ class Solution {
115133
class Solution {
116134
public:
117135
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;
128150
}
129151
}
130-
return -1;
152+
return nums[left] == target ? left : -1;
131153
}
132154
};
133155
```
134156
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+
135186
### **JavaScript**
136187

137188
```js
@@ -141,29 +192,26 @@ public:
141192
* @return {number}
142193
*/
143194
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+
}
165213
}
166-
return -1;
214+
return nums[left] == target ? left : -1;
167215
};
168216
```
169217

@@ -199,6 +247,33 @@ impl Solution {
199247
}
200248
```
201249

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+
202277
### **...**
203278

204279
```

0 commit comments

Comments
 (0)