1Next Permutation是什么
pre permutation 和 Next Permutation 是c++中的实现全排列前一个和下一个的函数。
排序是按照字典序,字典序,就是字符小的在前,这样数值小。
参考:
http://www.cnblogs.com/grandyang/p/4428207.html
我理解了字典序就是:
123---》132
说明从后面数,开始降序的那个元素,'2' 选出来,在从后找比2大的数,是'3',然后交换两者,如果两个index之间还有数就reverse。
再看一个例子:a数组
1 2 7 4 3 3 1
1 3 7 4 3 2 1
1 3 1 2 3 4 7
1 从后往前index,开始降序是a[1]=2 ,记下index=1, 然后从后往前找比a[1]大的,一定是在 [1:end]这个范围,因为你之前找降序的时候就约定了肯定有比这个大的。
2 a[5]=3,比2大 和a[1] 交换
3 对index+1进行reverse。这里用双指针的方法,
本来想对奇数个偶数个,区别下,发现都是一个函数
问题:如果pre permutation?更改的地方
1 从后往前index,开始升序的
2从后往前找比a[index]小的,然后交换
3 reverse
自己手敲下,运行下看看,
class Solution:
def nextPermutation(self, nums):
#121 543321
# 倒数,寻找第一个下降的1 和 之前上升没生过他的的下一个,胜过了
##pre pernutation的方法
#倒数,第一个上升的, 213---》132. 2和倒数比他大的交换,
#然后2之前的各位,从中间交换
if not nums or len(nums)==1:return nums
j=len(nums)-1
while j>0:
if nums[j-1]>=nums[j]:
j-=1
else:break
#判断是不是最后一个
if j!=0:
for i in range(len(nums)-1,j-1,-1):#
if nums[j-1]<nums[i]:
nums[j-1],nums[i]=nums[i],nums[j-1]
break
#从j开始都要降序--两种方法--我选双指针
for ij in range((len(nums)-1-j+1)//2):
start=j+ij;end=len(nums)-1-ij;
nums[start],nums[end]=nums[end],nums[start]
return nums
pp=Solution()
#[3,2,1]--->[1,2,3]
print(pp.nextPermutation([3,2,1]))
Runtime: 44 ms, faster than 99.84% of Python3 online submissions for Next Permutation.
显摆下,估计leetcode没有用python写的(逃~)
参考java的: