Skip to content

Commit b8cc919

Browse files
authored
feat: update solutions to lc problems: No.0702,0703,1704 (doocs#3237)
1 parent 9c63941 commit b8cc919

File tree

23 files changed

+578
-770
lines changed

23 files changed

+578
-770
lines changed

solution/0700-0799/0702.Search in a Sorted Array of Unknown Size/README.md

+77-32
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,13 @@ tags:
7070

7171
<!-- solution:start -->
7272

73-
### 方法一
73+
### 方法一:二分查找
74+
75+
我们先定义一个指针 $r = 1$,每一次判断 $r$ 处的值是否小于目标值,如果小于目标值,我们将 $r$ 乘以 $2$,即左移一位,直到 $r$ 处的值大于等于目标值。此时,我们可以确定目标值在 $[r / 2, r]$ 的区间内。
76+
77+
接下来,我们定义一个指针 $l = r / 2$,然后我们可以使用二分查找的方法在 $[l, r]$ 的区间内查找目标值的位置。
78+
79+
时间复杂度 $O(\log M)$,其中 $M$ 为目标值的位置。空间复杂度 $O(1)$。
7480

7581
<!-- tabs:start -->
7682

@@ -86,20 +92,18 @@ tags:
8692

8793

8894
class Solution:
89-
def search(self, reader, target):
90-
"""
91-
:type reader: ArrayReader
92-
:type target: int
93-
:rtype: int
94-
"""
95-
left, right = 0, 20000
96-
while left < right:
97-
mid = (left + right) >> 1
95+
def search(self, reader: "ArrayReader", target: int) -> int:
96+
r = 1
97+
while reader.get(r) < target:
98+
r <<= 1
99+
l = r >> 1
100+
while l < r:
101+
mid = (l + r) >> 1
98102
if reader.get(mid) >= target:
99-
right = mid
103+
r = mid
100104
else:
101-
left = mid + 1
102-
return left if reader.get(left) == target else -1
105+
l = mid + 1
106+
return l if reader.get(l) == target else -1
103107
```
104108

105109
#### Java
@@ -115,16 +119,20 @@ class Solution:
115119

116120
class Solution {
117121
public int search(ArrayReader reader, int target) {
118-
int left = 0, right = 20000;
119-
while (left < right) {
120-
int mid = left + right >> 1;
122+
int r = 1;
123+
while (reader.get(r) < target) {
124+
r <<= 1;
125+
}
126+
int l = r >> 1;
127+
while (l < r) {
128+
int mid = (l + r) >> 1;
121129
if (reader.get(mid) >= target) {
122-
right = mid;
130+
r = mid;
123131
} else {
124-
left = mid + 1;
132+
l = mid + 1;
125133
}
126134
}
127-
return reader.get(left) == target ? left : -1;
135+
return reader.get(l) == target ? l : -1;
128136
}
129137
}
130138
```
@@ -144,16 +152,20 @@ class Solution {
144152
class Solution {
145153
public:
146154
int search(const ArrayReader& reader, int target) {
147-
int left = 0, right = 20000;
148-
while (left < right) {
149-
int mid = left + right >> 1;
155+
int r = 1;
156+
while (reader.get(r) < target) {
157+
r <<= 1;
158+
}
159+
int l = r >> 1;
160+
while (l < r) {
161+
int mid = (l + r) >> 1;
150162
if (reader.get(mid) >= target) {
151-
right = mid;
163+
r = mid;
152164
} else {
153-
left = mid + 1;
165+
l = mid + 1;
154166
}
155167
}
156-
return reader.get(left) == target ? left : -1;
168+
return reader.get(l) == target ? l : -1;
157169
}
158170
};
159171
```
@@ -171,22 +183,55 @@ public:
171183
*/
172184
173185
func search(reader ArrayReader, target int) int {
174-
left, right := 0, 20000
175-
for left < right {
176-
mid := (left + right) >> 1
186+
r := 1
187+
for reader.get(r) < target {
188+
r <<= 1
189+
}
190+
l := r >> 1
191+
for l < r {
192+
mid := (l + r) >> 1
177193
if reader.get(mid) >= target {
178-
right = mid
194+
r = mid
179195
} else {
180-
left = mid + 1
196+
l = mid + 1
181197
}
182198
}
183-
if reader.get(left) == target {
184-
return left
199+
if reader.get(l) == target {
200+
return l
185201
}
186202
return -1
187203
}
188204
```
189205

206+
#### TypeScript
207+
208+
```ts
209+
/**
210+
* class ArrayReader {
211+
* // This is the ArrayReader's API interface.
212+
* // You should not implement it, or speculate about its implementation
213+
* get(index: number): number {};
214+
* };
215+
*/
216+
217+
function search(reader: ArrayReader, target: number): number {
218+
let r = 1;
219+
while (reader.get(r) < target) {
220+
r <<= 1;
221+
}
222+
let l = r >> 1;
223+
while (l < r) {
224+
const mid = (l + r) >> 1;
225+
if (reader.get(mid) >= target) {
226+
r = mid;
227+
} else {
228+
l = mid + 1;
229+
}
230+
}
231+
return reader.get(l) === target ? l : -1;
232+
}
233+
```
234+
190235
<!-- tabs:end -->
191236

192237
<!-- solution:end -->

solution/0700-0799/0702.Search in a Sorted Array of Unknown Size/README_EN.md

+77-32
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,13 @@ tags:
6565

6666
<!-- solution:start -->
6767

68-
### Solution 1
68+
### Solution 1: Binary Search
69+
70+
First, we define a pointer $r = 1$. Each time, we check if the value at position $r$ is less than the target value. If it is, we multiply $r$ by $2$, i.e., shift it left by one bit, until the value at position $r$ is greater than or equal to the target value. At this point, we can determine that the target value is within the interval $[r / 2, r]$.
71+
72+
Next, we define a pointer $l = r / 2$, and then we can use the binary search method to find the position of the target value within the interval $[l, r]$.
73+
74+
The time complexity is $O(\log M)$, where $M$ is the position of the target value. The space complexity is $O(1)$.
6975

7076
<!-- tabs:start -->
7177

@@ -81,20 +87,18 @@ tags:
8187

8288

8389
class Solution:
84-
def search(self, reader, target):
85-
"""
86-
:type reader: ArrayReader
87-
:type target: int
88-
:rtype: int
89-
"""
90-
left, right = 0, 20000
91-
while left < right:
92-
mid = (left + right) >> 1
90+
def search(self, reader: "ArrayReader", target: int) -> int:
91+
r = 1
92+
while reader.get(r) < target:
93+
r <<= 1
94+
l = r >> 1
95+
while l < r:
96+
mid = (l + r) >> 1
9397
if reader.get(mid) >= target:
94-
right = mid
98+
r = mid
9599
else:
96-
left = mid + 1
97-
return left if reader.get(left) == target else -1
100+
l = mid + 1
101+
return l if reader.get(l) == target else -1
98102
```
99103

100104
#### Java
@@ -110,16 +114,20 @@ class Solution:
110114

111115
class Solution {
112116
public int search(ArrayReader reader, int target) {
113-
int left = 0, right = 20000;
114-
while (left < right) {
115-
int mid = left + right >> 1;
117+
int r = 1;
118+
while (reader.get(r) < target) {
119+
r <<= 1;
120+
}
121+
int l = r >> 1;
122+
while (l < r) {
123+
int mid = (l + r) >> 1;
116124
if (reader.get(mid) >= target) {
117-
right = mid;
125+
r = mid;
118126
} else {
119-
left = mid + 1;
127+
l = mid + 1;
120128
}
121129
}
122-
return reader.get(left) == target ? left : -1;
130+
return reader.get(l) == target ? l : -1;
123131
}
124132
}
125133
```
@@ -139,16 +147,20 @@ class Solution {
139147
class Solution {
140148
public:
141149
int search(const ArrayReader& reader, int target) {
142-
int left = 0, right = 20000;
143-
while (left < right) {
144-
int mid = left + right >> 1;
150+
int r = 1;
151+
while (reader.get(r) < target) {
152+
r <<= 1;
153+
}
154+
int l = r >> 1;
155+
while (l < r) {
156+
int mid = (l + r) >> 1;
145157
if (reader.get(mid) >= target) {
146-
right = mid;
158+
r = mid;
147159
} else {
148-
left = mid + 1;
160+
l = mid + 1;
149161
}
150162
}
151-
return reader.get(left) == target ? left : -1;
163+
return reader.get(l) == target ? l : -1;
152164
}
153165
};
154166
```
@@ -166,22 +178,55 @@ public:
166178
*/
167179
168180
func search(reader ArrayReader, target int) int {
169-
left, right := 0, 20000
170-
for left < right {
171-
mid := (left + right) >> 1
181+
r := 1
182+
for reader.get(r) < target {
183+
r <<= 1
184+
}
185+
l := r >> 1
186+
for l < r {
187+
mid := (l + r) >> 1
172188
if reader.get(mid) >= target {
173-
right = mid
189+
r = mid
174190
} else {
175-
left = mid + 1
191+
l = mid + 1
176192
}
177193
}
178-
if reader.get(left) == target {
179-
return left
194+
if reader.get(l) == target {
195+
return l
180196
}
181197
return -1
182198
}
183199
```
184200

201+
#### TypeScript
202+
203+
```ts
204+
/**
205+
* class ArrayReader {
206+
* // This is the ArrayReader's API interface.
207+
* // You should not implement it, or speculate about its implementation
208+
* get(index: number): number {};
209+
* };
210+
*/
211+
212+
function search(reader: ArrayReader, target: number): number {
213+
let r = 1;
214+
while (reader.get(r) < target) {
215+
r <<= 1;
216+
}
217+
let l = r >> 1;
218+
while (l < r) {
219+
const mid = (l + r) >> 1;
220+
if (reader.get(mid) >= target) {
221+
r = mid;
222+
} else {
223+
l = mid + 1;
224+
}
225+
}
226+
return reader.get(l) === target ? l : -1;
227+
}
228+
```
229+
185230
<!-- tabs:end -->
186231

187232
<!-- solution:end -->

solution/0700-0799/0702.Search in a Sorted Array of Unknown Size/Solution.cpp

+10-6
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,19 @@
1010
class Solution {
1111
public:
1212
int search(const ArrayReader& reader, int target) {
13-
int left = 0, right = 20000;
14-
while (left < right) {
15-
int mid = left + right >> 1;
13+
int r = 1;
14+
while (reader.get(r) < target) {
15+
r <<= 1;
16+
}
17+
int l = r >> 1;
18+
while (l < r) {
19+
int mid = (l + r) >> 1;
1620
if (reader.get(mid) >= target) {
17-
right = mid;
21+
r = mid;
1822
} else {
19-
left = mid + 1;
23+
l = mid + 1;
2024
}
2125
}
22-
return reader.get(left) == target ? left : -1;
26+
return reader.get(l) == target ? l : -1;
2327
}
2428
};

solution/0700-0799/0702.Search in a Sorted Array of Unknown Size/Solution.go

+11-7
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,21 @@
88
*/
99

1010
func search(reader ArrayReader, target int) int {
11-
left, right := 0, 20000
12-
for left < right {
13-
mid := (left + right) >> 1
11+
r := 1
12+
for reader.get(r) < target {
13+
r <<= 1
14+
}
15+
l := r >> 1
16+
for l < r {
17+
mid := (l + r) >> 1
1418
if reader.get(mid) >= target {
15-
right = mid
19+
r = mid
1620
} else {
17-
left = mid + 1
21+
l = mid + 1
1822
}
1923
}
20-
if reader.get(left) == target {
21-
return left
24+
if reader.get(l) == target {
25+
return l
2226
}
2327
return -1
2428
}

0 commit comments

Comments
 (0)