LeetCode.31 | 下一个排列

我是研究僧i 提交于 2020-04-21 18:35:09
"""
https://leetcode-cn.com/problems/next-permutation/solution/xia-yi-ge-pai-lie-by-leetcode/
https://leetcode-cn.com/problems/next-permutation/solution/ti-yi-zhuan-hua-zhao-zui-hou-yi-dui-shun-xu-dui-92/
nums=         1 2  4 7 18 15 13  5 3 1
找到'顺序对':   1 2 4 13 18 15 7  5 3 1
后面部分升序:   1 2 4 13 1 3 5 7  15 18 
思路:此题比较验证,按官方题解抄写python版     
    1定义变量pos=-1,遍历数组i-1~0
    2如果num[i]<=num[i+1],获取最后一个升序pos位置
    3.1如果pos=-1,reverse(nums)
    3.2如果pos<>-1,始初化min_MaxPos=pos
       用index在[pos+1,end]中num[index]>num[pos]的最小值
    3.3将num[index]和num[pos]交换,组成新的序列
    4将交换完成后的num[pos,end]进行升序        
特判:如果原数组是倒序数组,将原数组进行reverse
python序列倒序[::-1]    
"""
def reverse(nums,start,end):
    while start<end:
        tmp=nums[start]
        nums[start]=nums[end]
        nums[end]=tmp
        start=start+1
        end=end-1

def nextPermutation(nums):
    """
    Do not return anything, modify nums in-place instead.
    """
    len_nums=len(nums) 
    #数组<=1,返回nums
    if len(nums)<=1:
        return nums    
    i=len_nums-2                        #位置从nums[end-1]开始,防止溢止
    pos=-1                              #初始化pos
    flag=True                           #循环退出值
    #自后向前查找到降序值
    while i>=0 and flag:   
        if nums[i+1]<=nums[i]:
            i=i-1
        else:
            pos=i
            flag=False                  #退出循环
    if pos==-1:                         #数组原本就是降序排序
        nums[:]= nums[::-1]             #全部数组倒序
    else:
        #查找比num[pos]大的最小值
        index=len_nums-1
        while index>=0 and nums[index]<=nums[pos]: 
            index=index-1
        #交换pos和index
        tmp=nums[pos]
        nums[pos]=nums[index]
        nums[index]=tmp
        #将[pos+1:End]倒序处理
        nums[:]=nums[:pos+1]+nums[len_nums-1:pos:-1]  
    #    reverse(nums,len_nums-1,pos)    
    print(nums)

nums=[int(num) for num in "321"]
nextPermutation(nums)

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!