Loading

Leetcode - 31. 下一个排列

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列(即,组合出下一个更大的整数)。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。

示例 1:

输入:nums = [1,2,3]
输出:[1,3,2]

示例 2:

输入:nums = [3,2,1]
输出:[1,2,3]

示例 3:

输入:nums = [1,1,5]
输出:[1,5,1]

示例 4:

输入:nums = [1]
输出:[1]

提示:

  • 1 <= nums.length <= 100
  • 0 <= nums[i] <= 100

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

解1 2021/8/31 O(logn)

def nextPermutation(nums: list) -> None:
    """
    Do not return anything, modify nums in-place instead.
    """
    # 不能用permutation,太耗时,而且空间是O(n^2)

    # 1,54,3,7,11,1,1,3,9,20,5
    # 下一个:
    # 1,54,3,7,11,1,1,3,20,5,9

    # 1,54,3,7,11,1,1,3,9,20,11,5
    # 下一个:
    # 1,54,3,7,11,1,1,3,11,5,9,20

    # 思路,从倒数第二个开始找,
    # 1)如果是倒序的,继续往前走
    # 2)如果不是倒序的,从后面找到比当前数大一点的数(大的数中最小的那个),交换一下值
    # 3)后面的做升序
    # 4)如果整个都是倒序的,整个做升序

    len=nums.__len__()
    if len==1: return
    # 升序
    sx=sorted(nums)
    # 降序
    jx=sorted(nums,key=lambda x:-x)
    if jx==nums:
        ### 错误 - 1
        # 整个赋值,只是引用,里面打出来是对的,但外面打出来不对,这里id(nums)=id(sx)
        # 如果只是nums[idx:]=[xxx],是赋值,id(nums)没有变,所以内外打出来是一致的
        #nums=sx
        nums.sort()
        ### 错误 - 1
        return
    idx=len-2
    while idx>=0:
        tmp=nums[idx:]
        jx=sorted(tmp,key=lambda x:-x)
        if tmp==jx:
            idx-=1
            continue
        i=1
        while i<tmp.__len__() and tmp[i]>tmp[0]: i+=1
        nums[idx]=tmp[0]+tmp[i-1]
        nums[idx+i-1]=nums[idx]-nums[idx+i-1]
        nums[idx]=nums[idx]-nums[idx+i-1]
        nums[idx+1:]=sorted(nums[idx+1:])
        return

if __name__ == '__main__':
    '''
    nums=[1,54,3,7,11,1,1,3,9,20,5]
    nextPermutation(nums);print(nums)
    nums=[1,2,3]
    nextPermutation(nums);print(nums)
    '''
    '''
    nums=[1,1,5]
    nextPermutation(nums);print(nums)
    nums=[1]
    nextPermutation(nums);print(nums)
    nums=[1,1,1,1,2,11]
    nextPermutation(nums);print(nums)
    nums=[1,54,3,7,11,1,1,3,9,20,11,9,9,5]
    nextPermutation(nums);print(nums)
    nums=[1,54]
    nextPermutation(nums);print(nums)
    nums=[1,1]
    nextPermutation(nums);print(nums)
    '''
    ### 错误
    # 1
    nums=[3,2,1]
    nextPermutation(nums);print(nums)

posted @ 2021-08-31 08:20  wwcg2235  阅读(56)  评论(0)    收藏  举报