3
3
* @param {number } k
4
4
* @return {number[][] }
5
5
*/
6
- var kClosest = function ( points , k ) {
7
- let arear = new Array ( points . length ) . fill ( 0 ) ;
8
- let pos = 0 ;
9
- for ( const point of points ) {
10
- let [ x , y ] = point ;
11
- arear [ pos ++ ] = [ x ** 2 + y ** 2 , point ] ;
6
+ var kClosest = function ( points , k ) {
7
+
8
+ const result = quickSelect ( ) ;
9
+ return result ;
10
+
11
+ function quickSelect ( ) {
12
+ let right = points . length - 1 ;
13
+ let left = 0 ;
14
+ let pivotIndex = points . length ;
15
+ while ( pivotIndex !== k ) {
16
+ pivotIndex = partition ( points , left , right )
17
+ if ( pivotIndex < k ) {
18
+ left = pivotIndex
19
+ } else {
20
+ right = pivotIndex - 1 ;
21
+ }
22
+ }
23
+ return points . slice ( 0 , k ) ;
12
24
}
13
- arear . sort ( ( a , b ) => a [ 0 ] - b [ 0 ] ) ;
14
- return arear . slice ( 0 , k ) . map ( e => e [ 1 ] ) ;
15
- } ;
25
+
26
+ function partition ( points , left , right ) {
27
+ let pivot = points [ Math . floor ( ( right + left ) / 2 ) ] ;
28
+ let pivotArea = calArea ( pivot ) ;
29
+ while ( left < right ) {
30
+ if ( calArea ( points [ left ] ) >= pivotArea ) {
31
+ [ points [ left ] , points [ right ] ] = [ points [ right ] , points [ left ] ] ;
32
+ right -- ;
33
+ } else {
34
+ left ++ ;
35
+ }
36
+ }
37
+ if ( calArea ( points [ left ] ) < pivotArea ) {
38
+ left ++ ;
39
+ }
40
+ return left ;
41
+ }
42
+
43
+ function calArea ( point ) {
44
+ const [ x , y ] = point ;
45
+ return x ** 2 + y ** 2
46
+ }
47
+ } ;
0 commit comments