实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。
如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。
必须原地修改,只允许使用额外常数空间。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/next-permutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
——————————————————
解题思路:首先需要知道字典序的意思,意思的数组的排序是按照字典的规则排序的。
对于上面这个数组,按照字典序,下一个较大的字典序为
也就是首先将图中的5和4进行交换,那么数字由158476531变为158576431,也就是在4之后的所有数字中选择一个大于4的最小值,也就是5。然后需要对交换后的76531进行排序,变为13567,数字就变为158513467。
因此我们整体的计算方法为:
(1)倒序遍历,当nums[i]<nums[i+1]的时候,就得到了要交换的数值。比如上面的4;
(2)从4向后遍历,4的位置为nums[i],当遍历到nums[k]>nums[i]>nums[j]时,将nums[k]和nums[i]的位置进行交换;
(3)将nums[i]之后的数据进行从小到大排序;
其Python代码如下:
class Solution:
def nextPermutation(self, nums: List[int]) -> None:
"""
Do not return anything, modify nums in-place instead.
"""
length = len(nums)
i = length - 2
while i>=0 and nums[i] >= nums[i+1]: # 找到nums[i]<nums[i+1]的位置
i-=1
if i>=0: # 交换位置
j = i+1
while j<length and nums[j]>nums[i]:
j+=1
temp = nums[j-1]
nums[j-1] = nums[i]
nums[i] = temp
L = i+1 # 将nums[i]之后的数据进行排序
R = length-1
while L<R:
temp = nums[L]
nums[L] = nums[R]
nums[R] = temp
L+=1
R-=1