@@ -11,38 +11,44 @@ def wiggleSort(self, nums):
11
11
med = (len (nums ) - 1 ) / 2
12
12
nums [::2 ], nums [1 ::2 ] = nums [med ::- 1 ], nums [:med :- 1 ]
13
13
14
+
14
15
# Time: O(n) ~ O(n^2)
15
16
# Space: O(1)
16
- # Tri Partition (aka Dutch National Flag Problem) with virtual index solution. (TLE)
17
+ # Tri Partition (aka Dutch National Flag Problem) with virtual index solution.
17
18
from random import randint
19
+
20
+
18
21
class Solution2 (object ):
19
22
def wiggleSort (self , nums ):
20
23
"""
21
24
:type nums: List[int]
22
- :rtype: void Do not return anything, modify nums in-place instead.
25
+ :rtype: None Do not return anything, modify nums in-place instead.
23
26
"""
24
- def findKthLargest (nums , k ):
25
- left , right = 0 , len (nums ) - 1
27
+ def nth_element (nums , n , compare = lambda a , b : a < b ):
28
+ def tri_partition (nums , left , right , target , compare ):
29
+ mid = left
30
+ while mid <= right :
31
+ if nums [mid ] == target :
32
+ mid += 1
33
+ elif compare (nums [mid ], target ):
34
+ nums [left ], nums [mid ] = nums [mid ], nums [left ]
35
+ left += 1
36
+ mid += 1
37
+ else :
38
+ nums [mid ], nums [right ] = nums [right ], nums [mid ]
39
+ right -= 1
40
+ return left , right
41
+
42
+ left , right = 0 , len (nums )- 1
26
43
while left <= right :
27
44
pivot_idx = randint (left , right )
28
- new_pivot_idx = partitionAroundPivot (left , right , pivot_idx , nums )
29
- if new_pivot_idx == k - 1 :
30
- return nums [new_pivot_idx ]
31
- elif new_pivot_idx > k - 1 :
32
- right = new_pivot_idx - 1
33
- else : # new_pivot_idx < k - 1.
34
- left = new_pivot_idx + 1
35
-
36
- def partitionAroundPivot (left , right , pivot_idx , nums ):
37
- pivot_value = nums [pivot_idx ]
38
- new_pivot_idx = left
39
- nums [pivot_idx ], nums [right ] = nums [right ], nums [pivot_idx ]
40
- for i in xrange (left , right ):
41
- if nums [i ] > pivot_value :
42
- nums [i ], nums [new_pivot_idx ] = nums [new_pivot_idx ], nums [i ]
43
- new_pivot_idx += 1
44
- nums [right ], nums [new_pivot_idx ] = nums [new_pivot_idx ], nums [right ]
45
- return new_pivot_idx
45
+ pivot_left , pivot_right = tri_partition (nums , left , right , nums [pivot_idx ], compare )
46
+ if pivot_left <= n <= pivot_right :
47
+ return
48
+ elif pivot_left > n :
49
+ right = pivot_left - 1
50
+ else : # pivot_right < n.
51
+ left = pivot_right + 1
46
52
47
53
def reversedTriPartitionWithVI (nums , val ):
48
54
def idx (i , N ):
@@ -61,7 +67,6 @@ def idx(i, N):
61
67
else :
62
68
j += 1
63
69
64
- mid = (len (nums ) - 1 ) / 2
65
- findKthLargest (nums , mid + 1 )
70
+ mid = (len (nums )- 1 ) // 2
71
+ nth_element (nums , mid )
66
72
reversedTriPartitionWithVI (nums , nums [mid ])
67
-
0 commit comments