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的: