Skip to content

Commit 262c9f1

Browse files
committed
feat: add 3rd ts solution to lc problem: No.0973
1 parent 6a8339b commit 262c9f1

File tree

3 files changed

+125
-0
lines changed

3 files changed

+125
-0
lines changed

solution/0900-0999/0973.K Closest Points to Origin/README.md

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,4 +177,50 @@ function kClosest(points: number[][], k: number): number[][] {
177177

178178
<!-- solution:end -->
179179

180+
<!-- solution:start -->
181+
182+
### Solution 3. Binary search
183+
184+
<!-- tabs:start -->
185+
186+
#### TypeScript
187+
188+
```ts
189+
function kClosest(points: number[][], k: number): number[][] {
190+
if (k === points.length) return points;
191+
192+
const distance = points.map(([x, y]) => x ** 2 + y ** 2);
193+
let indexes = points.map((_, i) => i);
194+
let [l, r] = [0, Math.max(...distance)];
195+
const res: number[] = [];
196+
197+
while (k) {
198+
const mid = (l + r) >> 1;
199+
200+
const closer: number[] = [];
201+
const farther: number[] = [];
202+
for (const i of indexes) {
203+
if (distance[i] <= mid) closer.push(i);
204+
else farther.push(i);
205+
}
206+
207+
if (closer.length > k) {
208+
r = mid;
209+
indexes = closer;
210+
} else {
211+
l = mid;
212+
k -= closer.length;
213+
res.push(...closer);
214+
indexes = farther;
215+
}
216+
}
217+
218+
return res.map(i => points[i]);
219+
}
220+
```
221+
222+
<!-- tabs:end -->
223+
224+
<!-- solution:end -->
225+
180226
<!-- problem:end -->

solution/0900-0999/0973.K Closest Points to Origin/README_EN.md

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,51 @@ function kClosest(points: number[][], k: number): number[][] {
170170
<!-- solution:end -->
171171

172172
<!-- problem:end -->
173+
174+
<!-- solution:start -->
175+
176+
### Solution 3. Binary search
177+
178+
<!-- tabs:start -->
179+
180+
#### TypeScript
181+
182+
```ts
183+
function kClosest(points: number[][], k: number): number[][] {
184+
if (k === points.length) return points;
185+
186+
const distance = points.map(([x, y]) => x ** 2 + y ** 2);
187+
let indexes = points.map((_, i) => i);
188+
let [l, r] = [0, Math.max(...distance)];
189+
const res: number[] = [];
190+
191+
while (k) {
192+
const mid = (l + r) >> 1;
193+
194+
const closer: number[] = [];
195+
const farther: number[] = [];
196+
for (const i of indexes) {
197+
if (distance[i] <= mid) closer.push(i);
198+
else farther.push(i);
199+
}
200+
201+
if (closer.length > k) {
202+
r = mid;
203+
indexes = closer;
204+
} else {
205+
l = mid;
206+
k -= closer.length;
207+
res.push(...closer);
208+
indexes = farther;
209+
}
210+
}
211+
212+
return res.map(i => points[i]);
213+
}
214+
```
215+
216+
<!-- tabs:end -->
217+
218+
<!-- solution:end -->
219+
220+
<!-- problem:end -->
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
function kClosest(points: number[][], k: number): number[][] {
2+
if (k === points.length) return points;
3+
4+
const distance = points.map(([x, y]) => x ** 2 + y ** 2);
5+
let indexes = points.map((_, i) => i);
6+
let [l, r] = [0, Math.max(...distance)];
7+
const res: number[] = [];
8+
9+
while (k) {
10+
const mid = (l + r) >> 1;
11+
12+
const closer: number[] = [];
13+
const farther: number[] = [];
14+
for (const i of indexes) {
15+
if (distance[i] <= mid) closer.push(i);
16+
else farther.push(i);
17+
}
18+
19+
if (closer.length > k) {
20+
r = mid;
21+
indexes = closer;
22+
} else {
23+
l = mid;
24+
k -= closer.length;
25+
res.push(...closer);
26+
indexes = farther;
27+
}
28+
}
29+
30+
return res.map(i => points[i]);
31+
}

0 commit comments

Comments
 (0)