leetcode_280 摆动排序

267 阅读1分钟

要求

给你一个无序的数组 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

image.png

解题思路:第一种解法非原地版本,首先先排序,当数组的个数是偶数的时候,我们首先找到中间元素,让后将中间元素前面的元素倒叙排列,并得到中间元素之后的元素,设置一个标志位,然后从我们的大位数组中取一个,在小位数组中取一个,这样就会形成一个摆动数组;当数组的个数是奇数的时候,就是在取中间值的时候有所不同,其余步骤都是相同的。第二种解法:我们从前向后进行扫描,当是偶数的时候放大值,当是奇数的时候放小值,前后两个值进行比较,不满足,直接交换位置,思路比较简单。