要求
给你一个无序的数组 nums, 将该数字 原地 重排后使得 nums[0] <= nums[1] >= nums[2] <= nums[3]...。
示例:
输入: nums = [3,5,2,1,6,4]
输出: 一个可能的解答是 [3,5,1,6,2,4]
核心代码
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if not nums:
return nums
nums.sort()
if len(nums) % 2 == 0:
nums[:] = self.solution1(nums,k = 1)
else:
nums[:] = self.solution1(nums)
def solution1(self,nums,k = 0):
res = [nums[len(nums) // 2 - k]]
n = len(nums)
flag = 1
l1,l2 = nums[:len(nums) // 2 - k][::-1],nums[len(nums) // 2:]
while len(res) < n:
if not flag:
res.append(l1.pop())
flag = 1
else:
res.append(l2.pop())
flag = 0
return res
第二种解法
class Solution:
def wiggleSort(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
if not nums:
return nums
i = 0
while i < len(nums):
if i % 2 == 0 and i < len(nums) - 1 and nums[i]> nums[i + 1]:
nums[i],nums[i + 1] = nums[i + 1],nums[i]
elif i % 2 and i < len(nums) - 1 and nums[i] < nums[i + 1]:
nums[i],nums[i + 1] = nums[i + 1],nums[i]
else:
i += 1
return nums
解题思路:第一种解法:非原地版本,首先先排序,当数组的个数是偶数的时候,我们首先找到中间元素,让后将中间元素前面的元素倒叙排列,并得到中间元素之后的元素,设置一个标志位,然后从我们的大位数组中取一个,在小位数组中取一个,这样就会形成一个摆动数组;当数组的个数是奇数的时候,就是在取中间值的时候有所不同,其余步骤都是相同的。第二种解法:我们从前向后进行扫描,当是偶数的时候放大值,当是奇数的时候放小值,前后两个值进行比较,不满足,直接交换位置,思路比较简单。