permutations(全排列)
阿新 • • 發佈:2019-01-09
題目描述
Given a collection of numbers, return all possible permutations.
For example,
[1,2,3]have the following permutations:
[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2], and[3,2,1].
題目大意
給定一個數組集合,返回所有可能的排列。
思路
給的提示是分治+遞迴。
分治:就是把一個複雜的問題分成兩個或更多的相同或相似的子問題,再把子問題分成更小的子問題……直到最後子問題可以簡單的直接求解,原問題的解即子問題的解的合併。
由例項可以看出來,全排列是有規律可循的:
第一個排列是集合由小到大排列;
第二個交換了最後兩個數字;
第三個交換了一二兩個數字;
第四個是在第三個的基礎上交換了二三兩個數字;
… …
程式碼
#include<iostream> #include<vector> using namespace std; void permute_help(vector<vector<int> > &, vector<int> &, int); vector<vector<int> > permute(vector<int> &num) { vector<vector<int> > res; if(num.size() == 0)return res; permute_help(res, num, 0); return res; } void permute_help(vector<vector<int> > &res, vector<int> &num, int index) { if(index == num.size()-1) { res.push_back(num); return; } for(int i=index; i<num.size(); i++) { swap(num[i], num[index]); permute_help(res, num, index+1); swap(num[i], num[index]); } } int main() { vector<int> num; for(int i=1; i<=3; i++) { num.push_back(i); } vector<vector<int> > res = permute(num); for(int i=0; i<res.size(); i++) { for(int j=0; j<res[0].size(); j++) { cout << res[i][j]<<' '; } cout << endl; } return 0; }
執行結果
以上。