原题链接:https://leetcode-cn.com/problems/next-permutation/。
不太清楚下一个排列是什么意思,直接参考官方给出的解题步骤。
同样举一个例子:
对于一个列表:
1 3 4 2 7 5 3 1
第一步从列表的末尾开始向前找到一个比后一个数小的数。
就是红色标识数字2
1 3 4 2 7 5 3 1
然后找到2以前从后往前第一个比2大的数就是3.
1 3 4 2 7 5 3 1
交换这两数。
1 3 4 3 7 5 2 1
然后翻转3 以后的列表。
1 3 4 3 1 2 5 7
这样就得到下一个排列。
下面是python3代码。
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
def reverse(nums,i,j): # 翻转列表
while i < j:
nums[i], nums[j] = nums[j], nums[i]
i, j = i+1, j-1
length = len(nums) - 1
i = length - 1
j = length
while i >= 0 and nums[i] >= nums[i+1]:# 从后往前寻找第一个不大于的数nums[i]
i -= 1
if i >=0:
while nums[j] <= nums[i]:# 从后往前寻找第一个大于nums[i]的数nums[j]索引j
j -= 1
nums[i],nums[j] = nums[j],nums[i]#交换数字
reverse(nums,i+1,length)#翻转数组