原题链接
https://leetcode.com/problems/next-permutation/
解题思路
从后往前先找出第一对为升序的数字,使flag指向第一个数;再从后往前开始遍历,当nums[i]大于nums[flag]时,交换这两个数字,并break;最后将nums[flag+1:]倒过来,使它们变为从小到大的排序,在输出nums即可
代码
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: None Do not return anything, modify nums in-place instead.
"""
if nums == [] or len(nums) == 1:
return nums
lastone = True
flag = len(nums)-1
for i in range(len(nums)-1, 0, -1): #标记flag
if nums[i-1] < nums[i]:
flag = i - 1
break
for i in range(len(nums)-1, flag, -1): #从后向前找出小于nums[flag]的元素
if nums[i] > nums[flag]:
tmp = nums[flag]
nums[flag] = nums[i]
nums[i] = tmp
lastone = False
break
if lastone == True: #如果是最后一个直接倒置
return nums[::-1]
nums[flag+1:] = nums[flag+1:][::-1] #将flag后的序列倒转为由小到大排列的序列
return nums
参考链接
https://www.cnblogs.com/zuoyuan/p/3780167.html