1
+ /**
2
+ * https://leetcode-cn.com/problems/k-closest-points-to-origin/submissions/
3
+ *
4
+ * 973. 最接近原点的 K 个点
5
+ *
6
+ * Medium
7
+ *
8
+ * 192ms 100.00%
9
+ * 48mb 70%
10
+ *
11
+ * O(n)
12
+ */
13
+ const kClosest = ( points , K ) => {
14
+ if ( K === points . length ) {
15
+ return points ;
16
+ }
17
+ findKClosest ( points , 0 , points . length - 1 , K ) ;
18
+ return points . slice ( 0 , K ) ;
19
+ }
20
+
21
+ function swap ( points , i , j ) {
22
+ if ( i === j ) {
23
+ return ;
24
+ }
25
+ const divisionPoint = points [ i ] ;
26
+ points [ i ] = points [ j ] ;
27
+ points [ j ] = divisionPoint ;
28
+ }
29
+
30
+ function getDistance ( points ) {
31
+ const [ x , y ] = points ;
32
+ // 这里没必要取根号,可以节省点时间复杂度
33
+ return x ** 2 + y ** 2 ;
34
+ }
35
+
36
+ function findKClosest ( points , startIndex , endIndex , K ) {
37
+ if ( startIndex > endIndex ) {
38
+ return ;
39
+ }
40
+
41
+ const startItemDistance = getDistance ( points [ startIndex ] ) ;
42
+
43
+ let divisionPoint = startIndex ;
44
+
45
+ swap ( points , startIndex , endIndex ) ;
46
+
47
+ for ( let i = startIndex ; i < endIndex ; i ++ ) {
48
+ if ( getDistance ( points [ i ] ) < startItemDistance ) {
49
+ swap ( points , i , divisionPoint ) ;
50
+ divisionPoint ++ ;
51
+ }
52
+ }
53
+ swap ( points , divisionPoint , endIndex ) ;
54
+
55
+ if ( divisionPoint + 1 === K ) {
56
+ return
57
+ } else if ( divisionPoint + 1 < K ) {
58
+ findKClosest ( points , divisionPoint + 1 , endIndex , K ) ;
59
+ } else {
60
+ findKClosest ( points , startIndex , divisionPoint - 1 , K ) ;
61
+ }
62
+ }
0 commit comments