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

猜你喜欢

转载自www.cnblogs.com/yanmk/p/8907272.html