算法题7寻找下一个排列

Posted MKYAN

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题7寻找下一个排列相关的知识,希望对你有一定的参考价值。

来自:LeetCode 37

实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列。

如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列)。

必须原地修改,只允许使用额外常数空间。

以下是一些例子,输入位于左侧列,其相应输出位于右侧列。
1,2,3 → 1,3,2
3,2,1 → 1,2,3
1,1,5 → 1,5,1

解决方案:

参见博客:Next lexicographical permutation algorithm

代码如下:

 1 class Solution:
 2     def nextPermutation(self, nums):
 3         """
 4         :type nums: List[int]
 5         :rtype: void Do not return anything, modify nums in-place instead.
 6         """
 7         right=len(nums)-1
 8         while nums[right]<=nums[right-1] and right-1>=0:
 9             right -=1
10         if right==0:
11             return self.reverse(nums,0,len(nums)-1)
12         
13         privot=right-1
14         
15         successor=0
16         for i in range(len(nums)-1,privot,-1):
17             if nums[i]>nums[privot]:
18                 successor=i
19                 break
20         nums[privot],nums[successor]=nums[successor],nums[privot]
21         self.reverse(nums,privot+1,len(nums)-1)
22         return nums
23 
24     def reverse(self,nums,l,r):
25         while l<r:
26             nums[l],nums[r]=nums[r],nums[l]
27             l+=1
28             r-=1

 

以上是关于算法题7寻找下一个排列的主要内容,如果未能解决你的问题,请参考以下文章

算法问题寻找全排列的下一个数

算法问题寻找全排列的下一个数

经典算法题-基础-寻找二叉树的下一个节点

精选力扣500题 第32题 LeetCode 31. 下一个排列c++ / java 详细题解

NextPermutation,寻找下一个全排列

精选力扣500题 第73题 LeetCode 153. 寻找旋转排序数组中的最小值c++/java详细题解