File tree Expand file tree Collapse file tree 3 files changed +125
-0
lines changed
solution/0900-0999/0973.K Closest Points to Origin Expand file tree Collapse file tree 3 files changed +125
-0
lines changed Original file line number Diff line number Diff line change @@ -177,4 +177,50 @@ function kClosest(points: number[][], k: number): number[][] {
177
177
178
178
<!-- solution: end -->
179
179
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
+
180
226
<!-- problem: end -->
Original file line number Diff line number Diff line change @@ -170,3 +170,51 @@ function kClosest(points: number[][], k: number): number[][] {
170
170
<!-- solution: end -->
171
171
172
172
<!-- 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 -->
Original file line number Diff line number Diff line change
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
+ }
You can’t perform that action at this time.
0 commit comments