题目描述:实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。必须原地修改,只允许使用额外常数空间。
以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3
→1,3,2
3,2,1
→1,2,3
1,1,5
→1,5,1
解法1。理解题意,虽然我也不咋理解,找到背后的数学规律。
这道题让我们求下一个排列顺序,有题目中给的例子可以看出来,如果给定数组是降序,则说明是全排列的最后一种情况,则下一个排列就是最初始情况,可以参见之前的博客 Permutations 全排列。我们再来看下面一个例子,有如下的一个数组
1 2 7 4 3 1
下一个排列为:
1 3 1 2 4 7
那么是如何得到的呢,我们通过观察原数组可以发现,如果从末尾往前看,数字逐渐变大,到了2时才减小的,然后我们再从后往前找第一个比2大的数字,是3,那么我们交换2和3,再把此时3后面的所有数字转置一下即可,步骤如下:
1 2 7 4 3 1
1 2 7 4 3 1
1 3 7 4 2 1
1 3 1 2 4 7
class Solution(object):
def nextPermutation(self, nums):
"""
:type nums: List[int]
:rtype: void Do not return anything, modify nums in-place instead.
"""
i = len(nums) - 1
if len(list(set(nums))) != 1:
#先从尾部升序结束的点
while i - 1 >= 0:
if nums[i] <= nums[i - 1]:
i = i - 1
else:
break
#如果前面还有至少一个位置
if i - 1 >= 0:
j = i - 1
t = len(nums) - 1
#从后往前找第一个大于j位置上的数
while nums[t] <= nums[j]:
t -= 1
nums[t], nums[j] = nums[j], nums[t]
a = sorted(nums[i:])
a_index = 0
#因为我不知道python分段排序的方法,于是就手动排序
#以下是对nums的排序
for index in range(i, len(nums)):
nums[index] = a[a_index]
a_index += 1
#没有位置则sort
else:
nums.sort()
参考链接:https://blog.csdn.net/weixin_40449300/article/details/82468795