Leetcode做题日记:31. 下一个排列(PYTHON)

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。

1,2,3 → 1,3,2

3,2,1 → 1,2,3

1,1,5 → 1,5,1

最开始想到冒泡排序一次,但是输入[1,3,2]->[3,1,2]不对,应该是[2,1,3]

第一次的代码,击败99.97%,写的很罗嗦,最原始
思路:从最后一个数j开始,依次和前面一个数比较,如果发现前面一个数比j小,那么就存在下一个更大的数,将这个数和这个数后面(是升序)最右一个大于这个数的数(再往右就小于这个数了,交换反而变小)交换,交换之后,后面的序列要变成升序(即最小,这样才能继续迭代到下一个数)

 	Len=len(nums)
        j=Len-1 
        k=0 #只要没有交换过,那么表示这个数已经是最大的了,最后直接排序
        while j: 
            if nums[j-1]<nums[j]:
                k=1 #置1
                n=nums[j:] #取这个数后面的序列
                i=0
                while n[i]>nums[j-1]: #这个循环为了找到和这个数交换的数的数
                                      #如果没有比这个数小的数,那就和最后一个数
                                      #交换
                    i=i+1
                    if j+i==Len:
                        break
                temp1=nums[j+i-1] #最原始的交换,可改进
                temp2=nums[j-1]
                nums[j-1]=temp1
                nums[j+i-1]=temp2
                J=Len-1
                l=0
                while j+l<J-l: #排序了,也很原始
                    temp1=nums[j+l]
                    temp2=nums[J-l]
                    nums[J-l]=temp1
                    nums[j+l]=temp2
                    l=l+1
                
                break #不执行第二次   
            j=j-1    
        if k==0:
            nums.sort()#如果需要倒序 reverse=True

简化了一下代码和新的小方法

	Len=len(nums)
        j=Len-1
        k=0
        while j:
            if nums[j-1]<nums[j]:
                k=1
                n=nums[j:]
                i=0
                while n[i]>nums[j-1]:
                    i=i+1
                    if j+i==Len:
                        break
                nums[j-1],nums[j+i-1]=nums[j+i-1],nums[j-1] 
                #这个方法直接交换两个变量的
                n=nums[j:] #再一次取j后面的切片,两个切片n是不一样的
                n.sort() #排序,简单多了
                nums[j:]=n #直接修改片段,我之前没想到    
                break    
            j=j-1    
        if k==0:
            nums.sort()#如果需要倒序 reverse=True

猜你喜欢

转载自blog.csdn.net/weixin_44033136/article/details/85396027