Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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‎

Lines changed: 132 additions & 57 deletions
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)

AltStyle によって変換されたページ (->オリジナル) /