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 cadd62f

Browse files
feat: add solutions to lc/lcci problems (#1660)
* lc No.0081.Search in Rotated Sorted Array II * lcci No.10.03.Search Rotate Array
1 parent 3f772f3 commit cadd62f

File tree

14 files changed

+750
-149
lines changed

14 files changed

+750
-149
lines changed

‎lcci/10.03.Search Rotate Array/README.md‎

Lines changed: 164 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
## 题目描述
66

77
<!-- 这里写题目描述 -->
8+
89
<p>搜索旋转数组。给定一个排序后的数组,包含n个整数,但这个数组已被旋转过很多次了,次数不详。请编写代码找出数组中的某个元素,假设数组元素原先是按升序排列的。若有多个相同元素,返回索引值最小的一个。</p>
910
<p><strong>示例1:</strong></p>
1011
<pre><strong> 输入</strong>: arr = [15, 16, 19, 20, 25, 1, 3, 4, 5, 7, 10, 14], target = 5
@@ -22,22 +23,184 @@
2223
## 解法
2324

2425
<!-- 这里可写通用的实现逻辑 -->
26+
27+
**方法一:二分查找**
28+
29+
我们定义二分查找的左边界 $l=0,ドル右边界 $r=n-1,ドル其中 $n$ 为数组的长度。
30+
31+
每次在二分查找的过程中,我们会得到当前的中点 $mid=(l+r)/2$。
32+
33+
- 如果 $nums[mid] \gt nums[r],ドル说明 $[l,mid]$ 是有序的,此时如果 $nums[l] \le target \le nums[mid],ドル说明 $target$ 位于 $[l,mid],ドル否则 $target$ 位于 $[mid+1,r]$。
34+
- 如果 $nums[mid] \lt nums[r],ドル说明 $[mid+1,r]$ 是有序的,此时如果 $nums[mid] \lt target \le nums[r],ドル说明 $target$ 位于 $[mid+1,r],ドル否则 $target$ 位于 $[l,mid]$。
35+
- 如果 $nums[mid] = nums[r],ドル说明元素 $nums[mid]$ 和 $nums[r]$ 相等,此时无法判断 $target$ 位于哪个区间,我们只能将 $r$ 减少 1ドル$。
36+
37+
二分查找结束后,如果 $nums[l] = target,ドル则说明数组中存在目标值 $target,ドル否则说明不存在。
38+
39+
注意,如果一开始 $nums[l] = nums[r],ドル我们循环将 $r$ 减少 1ドル,ドル直到 $nums[l] \ne nums[r]$。
40+
41+
时间复杂度近似 $O(\log n),ドル空间复杂度 $O(1)$。其中 $n$ 为数组的长度。
42+
43+
相似题目:
44+
45+
- [81. 搜索旋转排序数组 II](/solution/0000-0099/0081.Search%20in%20Rotated%20Sorted%20Array%20II/README.md)
46+
2547
<!-- tabs:start -->
2648

2749
### **Python3**
2850

2951
<!-- 这里可写当前语言的特殊实现逻辑 -->
3052

3153
```python
32-
54+
class Solution:
55+
def search(self, arr: List[int], target: int) -> int:
56+
l, r = 0, len(arr) - 1
57+
while arr[l] == arr[r]:
58+
r -= 1
59+
while l < r:
60+
mid = (l + r) >> 1
61+
if arr[mid] > arr[r]:
62+
if arr[l] <= target <= arr[mid]:
63+
r = mid
64+
else:
65+
l = mid + 1
66+
elif arr[mid] < arr[r]:
67+
if arr[mid] < target <= arr[r]:
68+
l = mid + 1
69+
else:
70+
r = mid
71+
else:
72+
r -= 1
73+
return l if arr[l] == target else -1
3374
```
3475

3576
### **Java**
3677

3778
<!-- 这里可写当前语言的特殊实现逻辑 -->
3879

3980
```java
81+
class Solution {
82+
public int search(int[] arr, int target) {
83+
int l = 0, r = arr.length - 1;
84+
while (arr[l] == arr[r]) {
85+
--r;
86+
}
87+
while (l < r) {
88+
int mid = (l + r) >> 1;
89+
if (arr[mid] > arr[r]) {
90+
if (arr[l] <= target && target <= arr[mid]) {
91+
r = mid;
92+
} else {
93+
l = mid + 1;
94+
}
95+
} else if (arr[mid] < arr[r]) {
96+
if (arr[mid] < target && target <= arr[r]) {
97+
l = mid + 1;
98+
} else {
99+
r = mid;
100+
}
101+
} else {
102+
--r;
103+
}
104+
}
105+
return arr[l] == target ? l : -1;
106+
}
107+
}
108+
```
109+
110+
### **C++**
111+
112+
```cpp
113+
class Solution {
114+
public:
115+
int search(vector<int>& arr, int target) {
116+
int l = 0, r = arr.size() - 1;
117+
while (arr[l] == arr[r]) {
118+
--r;
119+
}
120+
while (l < r) {
121+
int mid = (l + r) >> 1;
122+
if (arr[mid] > arr[r]) {
123+
if (arr[l] <= target && target <= arr[mid]) {
124+
r = mid;
125+
} else {
126+
l = mid + 1;
127+
}
128+
} else if (arr[mid] < arr[r]) {
129+
if (arr[mid] < target && target <= arr[r]) {
130+
l = mid + 1;
131+
} else {
132+
r = mid;
133+
}
134+
} else {
135+
--r;
136+
}
137+
}
138+
return arr[l] == target ? l : -1;
139+
}
140+
};
141+
```
142+
143+
### **Go**
144+
145+
```go
146+
func search(arr []int, target int) int {
147+
l, r := 0, len(arr)-1
148+
for arr[l] == arr[r] {
149+
r--
150+
}
151+
for l < r {
152+
mid := (l + r) >> 1
153+
if arr[mid] > arr[r] {
154+
if arr[l] <= target && target <= arr[mid] {
155+
r = mid
156+
} else {
157+
l = mid + 1
158+
}
159+
} else if arr[mid] < arr[r] {
160+
if arr[mid] < target && target <= arr[r] {
161+
l = mid + 1
162+
} else {
163+
r = mid
164+
}
165+
} else {
166+
r--
167+
}
168+
}
169+
if arr[l] == target {
170+
return l
171+
}
172+
return -1
173+
}
174+
```
40175

176+
### **TypeScript**
177+
178+
```ts
179+
function search(arr: number[], target: number): number {
180+
let [l, r] = [0, arr.length - 1];
181+
while (arr[l] === arr[r]) {
182+
--r;
183+
}
184+
while (l < r) {
185+
const mid = (l + r) >> 1;
186+
if (arr[mid] > arr[r]) {
187+
if (arr[l] <= target && target <= arr[mid]) {
188+
r = mid;
189+
} else {
190+
l = mid + 1;
191+
}
192+
} else if (arr[mid] < arr[r]) {
193+
if (arr[mid] < target && target <= arr[r]) {
194+
l = mid + 1;
195+
} else {
196+
r = mid;
197+
}
198+
} else {
199+
--r;
200+
}
201+
}
202+
return arr[l] === target ? l : -1;
203+
}
41204
```
42205

43206
### **...**

‎lcci/10.03.Search Rotate Array/README_EN.md‎

Lines changed: 142 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,13 +33,154 @@
3333
### **Python3**
3434

3535
```python
36-
36+
class Solution:
37+
def search(self, arr: List[int], target: int) -> int:
38+
l, r = 0, len(arr) - 1
39+
while arr[l] == arr[r]:
40+
r -= 1
41+
while l < r:
42+
mid = (l + r) >> 1
43+
if arr[mid] > arr[r]:
44+
if arr[l] <= target <= arr[mid]:
45+
r = mid
46+
else:
47+
l = mid + 1
48+
elif arr[mid] < arr[r]:
49+
if arr[mid] < target <= arr[r]:
50+
l = mid + 1
51+
else:
52+
r = mid
53+
else:
54+
r -= 1
55+
return l if arr[l] == target else -1
3756
```
3857

3958
### **Java**
4059

4160
```java
61+
class Solution {
62+
public int search(int[] arr, int target) {
63+
int l = 0, r = arr.length - 1;
64+
while (arr[l] == arr[r]) {
65+
--r;
66+
}
67+
while (l < r) {
68+
int mid = (l + r) >> 1;
69+
if (arr[mid] > arr[r]) {
70+
if (arr[l] <= target && target <= arr[mid]) {
71+
r = mid;
72+
} else {
73+
l = mid + 1;
74+
}
75+
} else if (arr[mid] < arr[r]) {
76+
if (arr[mid] < target && target <= arr[r]) {
77+
l = mid + 1;
78+
} else {
79+
r = mid;
80+
}
81+
} else {
82+
--r;
83+
}
84+
}
85+
return arr[l] == target ? l : -1;
86+
}
87+
}
88+
```
89+
90+
### **C++**
91+
92+
```cpp
93+
class Solution {
94+
public:
95+
int search(vector<int>& arr, int target) {
96+
int l = 0, r = arr.size() - 1;
97+
while (arr[l] == arr[r]) {
98+
--r;
99+
}
100+
while (l < r) {
101+
int mid = (l + r) >> 1;
102+
if (arr[mid] > arr[r]) {
103+
if (arr[l] <= target && target <= arr[mid]) {
104+
r = mid;
105+
} else {
106+
l = mid + 1;
107+
}
108+
} else if (arr[mid] < arr[r]) {
109+
if (arr[mid] < target && target <= arr[r]) {
110+
l = mid + 1;
111+
} else {
112+
r = mid;
113+
}
114+
} else {
115+
--r;
116+
}
117+
}
118+
return arr[l] == target ? l : -1;
119+
}
120+
};
121+
```
122+
123+
### **Go**
124+
125+
```go
126+
func search(arr []int, target int) int {
127+
l, r := 0, len(arr)-1
128+
for arr[l] == arr[r] {
129+
r--
130+
}
131+
for l < r {
132+
mid := (l + r) >> 1
133+
if arr[mid] > arr[r] {
134+
if arr[l] <= target && target <= arr[mid] {
135+
r = mid
136+
} else {
137+
l = mid + 1
138+
}
139+
} else if arr[mid] < arr[r] {
140+
if arr[mid] < target && target <= arr[r] {
141+
l = mid + 1
142+
} else {
143+
r = mid
144+
}
145+
} else {
146+
r--
147+
}
148+
}
149+
if arr[l] == target {
150+
return l
151+
}
152+
return -1
153+
}
154+
```
42155

156+
### **TypeScript**
157+
158+
```ts
159+
function search(arr: number[], target: number): number {
160+
let [l, r] = [0, arr.length - 1];
161+
while (arr[l] === arr[r]) {
162+
--r;
163+
}
164+
while (l < r) {
165+
const mid = (l + r) >> 1;
166+
if (arr[mid] > arr[r]) {
167+
if (arr[l] <= target && target <= arr[mid]) {
168+
r = mid;
169+
} else {
170+
l = mid + 1;
171+
}
172+
} else if (arr[mid] < arr[r]) {
173+
if (arr[mid] < target && target <= arr[r]) {
174+
l = mid + 1;
175+
} else {
176+
r = mid;
177+
}
178+
} else {
179+
--r;
180+
}
181+
}
182+
return arr[l] === target ? l : -1;
183+
}
43184
```
44185

45186
### **...**
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
class Solution {
2+
public:
3+
int search(vector<int>& arr, int target) {
4+
int l = 0, r = arr.size() - 1;
5+
while (arr[l] == arr[r]) {
6+
--r;
7+
}
8+
while (l < r) {
9+
int mid = (l + r) >> 1;
10+
if (arr[mid] > arr[r]) {
11+
if (arr[l] <= target && target <= arr[mid]) {
12+
r = mid;
13+
} else {
14+
l = mid + 1;
15+
}
16+
} else if (arr[mid] < arr[r]) {
17+
if (arr[mid] < target && target <= arr[r]) {
18+
l = mid + 1;
19+
} else {
20+
r = mid;
21+
}
22+
} else {
23+
--r;
24+
}
25+
}
26+
return arr[l] == target ? l : -1;
27+
}
28+
};

0 commit comments

Comments
(0)

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