【算法题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