@@ -23,3 +23,85 @@ const findKthLargest = function(nums, k) {
23
23
else if ( k - larger . length - pivotCount <= 0 ) return pivot ;
24
24
else return findKthLargest ( smaller , k - larger . length - pivotCount ) ;
25
25
} ;
26
+
27
+ // another
28
+
29
+ /**
30
+ * @param {number[] } nums
31
+ * @param {number } k
32
+ * @return {number }
33
+ */
34
+ const findKthLargest = function ( nums , k ) {
35
+ return quickselect ( nums , 0 , nums . length - 1 , k )
36
+ } ;
37
+ function quickselect ( arr , lo , hi , k ) {
38
+ let pivtIdx = Math . floor ( Math . random ( ) * ( hi - lo + 1 ) ) + lo
39
+ let pivtVal = arr [ pivtIdx ]
40
+ ; [ arr [ hi ] , arr [ pivtIdx ] ] = [ arr [ pivtIdx ] , arr [ hi ] ]
41
+ let i = lo
42
+ let j = hi - 1
43
+
44
+ while ( i <= j ) {
45
+ if ( arr [ i ] <= pivtVal ) {
46
+ i ++
47
+ } else {
48
+ ; [ arr [ j ] , arr [ i ] ] = [ arr [ i ] , arr [ j ] ]
49
+ j --
50
+ }
51
+ }
52
+
53
+ ; [ arr [ i ] , arr [ hi ] ] = [ arr [ hi ] , arr [ i ] ]
54
+
55
+ pivtIdx = i
56
+
57
+ if ( pivtIdx === arr . length - k ) return arr [ pivtIdx ]
58
+ if ( pivtIdx < arr . length - k ) return quickselect ( arr , pivtIdx + 1 , hi , k )
59
+ return quickselect ( arr , lo , pivtIdx - 1 , k )
60
+ }
61
+
62
+ // another
63
+
64
+ /**
65
+ * @param {number[] } nums
66
+ * @param {number } k
67
+ * @return {number }
68
+ */
69
+ const findKthLargest = function ( list , k ) {
70
+ const len = list . length
71
+ let lo = 0
72
+ let hi = len - 1
73
+ let pivot = 0
74
+ let t = len - k
75
+ while ( lo < hi ) {
76
+ pivot = partition ( list , lo , hi )
77
+ if ( pivot === t ) {
78
+ break
79
+ } else if ( pivot < t ) {
80
+ lo = pivot + 1
81
+ } else if ( pivot > t ) {
82
+ hi = pivot - 1
83
+ }
84
+ }
85
+
86
+ return list [ t ]
87
+ }
88
+
89
+ function partition ( arr , s , e ) {
90
+ let t = arr [ e ]
91
+ let i = s
92
+ for ( let j = s ; j <= e - 1 ; j ++ ) {
93
+ if ( arr [ j ] <= t ) {
94
+ swap ( arr , i , j )
95
+ i ++
96
+ }
97
+ }
98
+ swap ( arr , i , e )
99
+ return i
100
+ }
101
+
102
+ function swap ( arr , i , j ) {
103
+ let tmp = arr [ i ]
104
+ arr [ i ] = arr [ j ]
105
+ arr [ j ] = tmp
106
+ }
107
+
0 commit comments