"""
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)
来源:oschina
链接:https://my.oschina.net/tedzheng/blog/3290631