边工作边刷题:70天一遍leetcode: day 45-2

Wiggle Sort II

要点:这题就是关于如何按序插入,基本的logic这个帖子介绍的很清楚:https://leetcode.com/discuss/76965/3-lines-python-with-explanation-proof。简单的方法就是先排序,O(nlgn)。python可以直接用extended slicing来assign。值得注意的是哪个点开始:因为从0开始的偶数点(0,2,4,。。。)只可能和奇数点等长或者多1个,所以取median作为小于部分的最后一个元素是正合适的(无论奇偶)。O(n)的方法本质类似,就是用quick selection O(n)找到median,然后再一个一个按序插入。
错误点:

  • 插入顺序:大的在odd index,小的在even index,而大的从左向右(start at 0)而小的从右向左(最后一个坐标在even位置)
class Solution(object):
    def wiggleSort(self, nums):
        """
        :type nums: List[int]
        :rtype: void Do not return anything, modify nums in-place instead.
        """
        n = len(nums)
        kths = sorted(nums)
        m = kths[(n-1)/2]
        res = [0]*n
        j = 1
        k = n-1 if n & 1 else n-2
        # print m,j,k
        for i in xrange(n):
            #print m,j,k
            if nums[i]>m:
                res[j]=nums[i]
                j+=2
            elif nums[i]<m:
                res[k]=nums[i]
                k-=2
        #print m,j,k
        for i in xrange(n):
            if nums[i]==m:
                if k>=0:
                    res[k]=m
                    k-=2
                else:
                    res[j]=m
                    j+=2
        nums[::] = res[::]
        
                
原文地址:https://www.cnblogs.com/absolute/p/5690306.html