C STL求全排列和組合

2021-08-21 14:56:10 字數 821 閱讀 8622

c++11 stl內建了求全排列的模板函式next_permutation和prev_permutation,屬於標頭檔案和std命名空間,使用非常方便。例如:

vector

a;while (next_permutation(a.begin(),a.end())

; for (int i = 0; i < a.size() - 2; ++i)

for (int j = i + 1; j < a.size() - 1; ++j)

for (int k = j + 1; k < a.size(); ++k)

}else

for (int i = start; i < n - (m - depth - 1);++i)

}//t可以調入vector, string等,需要支援下標操作及size()函式

template

vector

combine(t &data,int m)

; int depth = 0;

vector

result;

t temp(m,0);

combine_inner(data,0, data.size(), m, depth,temp,result);

return result;

}

呼叫時只需要這樣:

string s("abcdef");

vector

result = combine(s, 3);

很方便吧。時間複雜度o(c(n,m)),空間複雜度o(1)。

不使用遞迴求全排列和組合數

同學遇到的面試問題,大意是m臺機器放在n個房間,不使用遞迴求列印所有情況 解題思路 情況共計n m種。開始想將所有情況放入陣列,填充好陣列再逐個列印。隨後發現按照填充的思路,不使用大陣列也可以實現。思路是加入m n 3,則27種情況,記i0.i26。0.m個數,0放入i0 0 i1 1 i2 2 i...

遞迴求全排列

取出陣列中第乙個元素放到最後,即a 1 與a n 交換,然後遞迴求a n 1 的全排列 1 如果陣列只有乙個元素n 1,a 則全排列就是 2 如果陣列有兩個元素n 2,a 則全排列是 a 1 與a 2 交換。交換後求a 2 1 的全排列,歸結到1 a 2 與a 2 交換。交換後求a 2 1 的全排列...

庫函式求全排列

上級排列 prev permutation start,end 求的是當前排列的上乙個排列 對於 上乙個 和 下乙個 它們為字典序的前後,就是對於當前序列pn,他的下乙個序列pn 1,不存在另外的pm,使得pn字典序 不同排列的先後關係是從左 右逐個比較對應的數字的先後來決定的。例如 對於6個數字的...