Skip to content

Commit 17b7bcc

Browse files
authored
Update wiggle-sort-ii.py
1 parent 3b6815b commit 17b7bcc

File tree

1 file changed

+30
-25
lines changed

1 file changed

+30
-25
lines changed

Python/wiggle-sort-ii.py

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -11,38 +11,44 @@ def wiggleSort(self, nums):
1111
med = (len(nums) - 1) / 2
1212
nums[::2], nums[1::2] = nums[med::-1], nums[:med:-1]
1313

14+
1415
# Time: O(n) ~ O(n^2)
1516
# 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.
1718
from random import randint
19+
20+
1821
class Solution2(object):
1922
def wiggleSort(self, nums):
2023
"""
2124
: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.
2326
"""
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
2643
while left <= right:
2744
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
4652

4753
def reversedTriPartitionWithVI(nums, val):
4854
def idx(i, N):
@@ -61,7 +67,6 @@ def idx(i, N):
6167
else:
6268
j += 1
6369

64-
mid = (len(nums) - 1) / 2
65-
findKthLargest(nums, mid + 1)
70+
mid = (len(nums)-1)//2
71+
nth_element(nums, mid)
6672
reversedTriPartitionWithVI(nums, nums[mid])
67-

0 commit comments

Comments
 (0)