题目:
给定一个无序的数组 nums,将它重新排列成 nums[0] < nums[1] > nums[2] < nums[3]... 的顺序。
示例 1:
输入: nums = [1, 5, 1, 1, 6, 4]
输出: 一个可能的答案是 [1, 4, 1, 5, 1, 6]
示例 2:
输入: nums = [1, 3, 2, 2, 3, 1]
输出: 一个可能的答案是 [2, 3, 1, 3, 1, 2]
说明:
你可以假设所有输入都会得到有效的结果。
进阶:
你能用 O(n) 时间复杂度和 / 或原地 O(1) 额外空间来实现吗?
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/wiggle-sort-ii
方法一:
查找中位数,将数组划分为一大一小两个序列。将大序列和小序列依次穿插,得到最终序列 。注意中位数有相等元素的情况。
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
l = len(nums)
if l<=1:
return
mid_num = self.search_mid(nums, (l+1)//2)
A = []
B = []
for i in nums:
if i<mid_num:
A.append(i)
elif i>mid_num:
B.append(i)
for i in range((l+1)//2 - len(A)):
A.insert(0, mid_num)
for i in range(l//2-len(B)):
B.append(mid_num)
for i in range(l):
if i%2==0:
nums[i] = A.pop(0)
else:
nums[i] = B.pop(0)
def search_mid(self, nums, mid_index):
import random
mid = random.choice(nums)
A = []
B = []
n = 0
for i in nums:
if i<mid:
A.append(i)
elif i>mid:
B.append(i)
else:
n+=1
if len(A)==mid_index:
return mid
elif len(A)>mid_index:
return self.search_mid(A, mid_index)
elif len(A)+n>=mid_index:
return mid
else:
return self.search_mid(B, mid_index-len(A)-n)