Skip to content

Commit cadd62f

Browse files
authored
feat: add solutions to lc/lcci problems (doocs#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

+164-1
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

+142-1
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
### **...**
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)