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 b8cc919

Browse files
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‎

Lines changed: 77 additions & 32 deletions
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‎

Lines changed: 77 additions & 32 deletions
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‎

Lines changed: 10 additions & 6 deletions
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‎

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

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