stl提供了兩個用來計算排列組合關係的演算法,分別是next_permutation(「下乙個」排列組合)和prev_permutation(「前乙個」排列組合)。兩者都位於#include < algorithm >中。next_permutation:把兩個迭代器(或指標)指定的部分看作乙個排列,求出這些元素構成的全排列中,字典序排在下乙個的排列,並直接在序列上更新。另外,若不純在排名更靠前的排列,則返回false,否則返回true。
prev_permutation:同理與next_permutation,求出這些元素構成的全排列中,字典序排在前乙個的排列。
do
while
(next_permutation
(a, a + n));
//prev_permutation類似
若想實現全排列,首先把陣列先排序,因為next_permutation是找「下乙個」排列組合。所以先將陣列從小到大排序。
#include
#include
using
namespace std;
typedef
long
long ll;
intmain()
while
(next_permutation
(a +
1, a +3+
1));
return0;
}/*輸出:1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
*/
如果我們上述**使用的是prev_permutation,輸出結果只有1 2 3;把陣列從大到小排序,輸出結果也只有3 2 1。
輸出乙個陣列中第k個全排列的序列,也就比較容易了:
int k =0;
do}while
(next_permutation
(a +
1, a +3+
1));
或輸出任意乙個字串的字典序的全排列:
#include
#include
using
namespace std;
typedef
long
long ll;
intmain()
while
(next_permutation
(s.begin()
, s.
end())
);return0;
}/*輸出:abc
acbbac
bcacab
cba*/
46 全排列 全排列 遞迴
遞迴的時候每次確定乙個位置的數字 nums陣列在遞迴過程中分為左右兩部分,左邊部分是已經確定好的部分,而右邊是待確定數字的部分。每次都嘗試用當前位置右邊的數字來交換當前數字以確定當前數字。題目可以使用collections來優化。詳見 class solution 遞迴過程中每次確定乙個位置的數,遞...
46 全排列 47 全排列II
46.全排列 這題和之前做的劍指offer上的字串全排列。一樣。分析 1 如果原始要排列的陣列順序為1 2 3 4,現在只要分別交換1 2,1 3,1 4然後對剩下的3個元素進行遞迴的排列。自己的code 100 class solution if start nums.size 1 return ...
輸出全排列(C 全排列函式)
請編寫程式輸出前n個正整數的全排列 n 10 並通過9個測試用例 即n從1到9 觀察n逐步增大時程式的執行時間。輸入格式 輸入給出正整數n 10 輸出格式 輸出1到n的全排列。每種排列佔一行,數字間無空格。排列的輸出順序為字典序,即序列a 1,a2,an 排在序列b1,b2,bn之前,如果存在k使得...