实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
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