全排列next permutation函式

2021-10-17 18:40:49 字數 1397 閱讀 3550

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使得...