【死磕算法之1刷leetcode】——376 Wiggle Sort摆动序列

题目描述:

Given an unsorted array nums, reorder it in-place such that
nums[0] <= nums[1] >= nums[2] <= nums[3]…
Example:
Given nums = [3, 5, 2, 1, 6, 4], one possible answer is [1, 6, 2, 5, 3, 4].

题目分析

如何生成序列使得nums[0] <= nums[1] >= nums[2] <= nums[3]…?

方法1:交换法 时间复杂度O(n),空间复杂度O(1)

观察数组我们可以得到其规律,
设i为nums 的索引,i从1开始:

  1. i为奇数时,nums[i] >=nums[i-1]
  2. i为偶数时,nums [i]< =nums[i-1]

每个值只需要跟前一个值比较,如果不满足条件,交换一下,让它满足条件就好了。
也就是说nums[i] 和 nums[i-2]没有关系。

举个例子:
nums = [1,6,3,2,7,8,9]
迭代过程:
i =1:
6>1   符合条件 nums[1]>nums[0]
i = 2:
2<6   符合条件 nums[2]<nums[1]
 i = 3:
3<2  不符合条件  nums[3]>nums[2],将两者值交换。
 nums=[1,6,2,3,7,8,9]
 i = 4:
7>3  不符合nums[4]<nums[3],将两者值交换。
 nums = [1,6,2,7,3,8,9]
  i = 5:
8>7  符合nums[5]>nums[4]
 i = 6:
9>8 不符合nums[6]<nums[5],将两者值交换。
 nums = [1,6,2,7,3,9,8]
 因此wiggle sort最后排序结果为[1,6,2,7,3,9,8]
python实现:
 def wiggleSort1(self, nums):
        # write your code here
        #sort the array
        len1 = len(nums)
        if(len1<=1):
            return
        for i in range(1,len1):#偶数 nums[i]<=nums[i-1] #奇数 nums[i] >= nums[i-1],不符合条件的要交换
            if(i%2==0 and nums[i]>nums[i-1]):
                nums[i], nums[i-1] = nums[i-1],nums[i]
            elif i%2==1 and nums[i] < nums[i-1]:
                 nums[i], nums[i-1] = nums[i-1],nums[i]
方法2:排序法 时间复杂度O(nlog(n)),空间复杂度O(1)

将数组递增排序,将第3个元素和第2个元素交换,第5个元素和第4个元素交换…以此类推

仍然举例nums = [1,6,3,2,7,8,9],排序后nums = [1,2,3,6,7,8,9].
照排序法操作,nums = [1,3,2,7,6,9,8],满足摆动序列的性质。

python中sort()函数的时间复杂度为O(nlog(n)),遍历交换时间复杂度为O(n),因此整个方法的时间复杂度取O(nlog(n))

python实现:
 def wiggleSort2(self, nums):
        # write your code here
        # sort the array
        nums.sort()
        len1 = len(nums)
        if (len1 <= 1):
            return
        for i in range(2,len1,2):  #index从2遍历到len1-1,间隔为2
             nums[i], nums[i - 1] = nums[i - 1], nums[i]

后记:本文在
[Leetcode] Wiggle Sort 摇摆排序的基础上进行了整理,并增加了python实现代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值