生成组合数
举例:ios
好比有一个数组`int arr[3] = {1,4,8} `,生成组合数就是要生成`{1},{4},{8},{1,4},{1,8},{4,8},{1,4,8}`
思路:数组
要生成`{1,4,8}`这个数组的组合数,须要依赖`{1,4}`的组合数。若是记`{1,4}`的生成的组合数集合为A,那么生成`{1,4,8}`的组合数的方式为拷贝一份A序列集合获得B序列集合,对B序列集合中全部的序列,都加上一个8,那么`{1,4,8}`的序列结合就能够用`A+B+{8}`的方式表示。`{1,4}`也是相似的过程。由`{1}`加上`{1,4}`以及`{4}`构成。
实现:spa
class Solution { public: //arr 数组指针 //len 数组长度 //返回二维数组 vector<vector<int> > getAllCombination(int arr[], int len) { vector<vector<int> > combinations; vector<int> a; a.push_back(arr[0]); combinations.push_back(a); for (int i = 1; i < len; i++) { unsigned long l = combinations.size(); for (unsigned long j = 0; j < l; j++) { vector<int> temp = combinations[j]; temp.push_back(arr[i]); combinations.push_back(temp); } vector<int> b; b.push_back(arr[i]); combinations.push_back(b); } return combinations; } }; int main() { int arr[] = {1, 4, 8}; Solution s = Solution(); vector<vector<int> > c = s.getAllCombination(arr,3); for(int i = 0;i<c.size();i++){ for(int j = 0;j<c[i].size();j++){ cout << c[i][j] << "\t"; } cout <<endl; } }
生成组合数
举例:指针
生成排列数的过程,一样是上面的列子`{1,4,8}`对应的组合数序列就是`{1},{4},{8},{1,4},{4,1},{1,8},{8,1},{4,8},{8,4},{1,4,8},{1,8,4},{4,1,8},{4,8,1},{8,1,4},{8,4,1}`一共是15种。
思路:code
生成排列数序列与组合数序列最大的不一样就是排列数序列是有序的,而组合数序列是无序的,那么排列数序列的生成就须要组合数序列、以及对这些组合数序列进行全排序。全排序就是对于`{1,4}`要生成`{1,4}`与`{4,1}`.组合数上面讲过了,下面讲下如何根据给定集合生成全排序。
生成全排序:排序
考虑已经有序列`abc`,那么生成全排序以下: step1:对序列`abc`,经过将a与b、c交换获得`bac`和`cba`.或者交换b和c获得`acb`; step2:对`bac`又能够交换a与c获得`bca`;对`cba`交换b与a能够获得`cab`。 这样咱们就能够获得`abc`的全排序。这样一个过程就是不断交换元素,可是须要控制好交换的开始坐标以及结束条件。
全序列实现:get
class Solution{ public: vector<vector<int> >p; void permutation(int *arr,int start,int len){ if(start == len-1){ //根据当前序列构造序列 vector<int> temp; for(int i = 0;i<len;i++){ temp.push_back(arr[i]); } p.push_back(temp); } for(int i = start;i<len;i++){ swap(arr[start],arr[i]); permutation(arr,start+1,len); swap(arr[i],arr[start]); } } }; int main(){ int arr[] = {1,4,8}; Solution s = Solution(); s.permutation(arr,0,3);//s.p保存着全序列 for(int i = 0;i<s.p.size();i++){ for(int j = 0;j<s.p[i].size();j++){ cout << s.p[i][j] << "\t"; } cout << endl; } }
排列数生成:
最后咱们来生成排列数序列。就两步,首选生成组合数序列,其次对于每一个组合数序列,利用上面的全序列的生成过程生成每一个组合序列的全序列,把全部的全序列合在一块儿,就能够获得咱们的排列数序列。io
实现:class
#include <iostream> #include <vector> using namespace std; class Solution{ public: //构造组合数 vector<vector<int> > getAllCombination(int arr[],int len){ vector<vector<int> >ret; vector<int>a; a.push_back(arr[0]); ret.push_back(a); for(int i = 1;i<len;i++){ unsigned long l = ret.size(); for(int j = 0;j<l;j++){ vector<int> temp = ret[j]; temp.push_back(arr[i]); ret.push_back(temp); } vector<int>b; b.push_back(arr[i]); ret.push_back(b); } return ret; } vector<vector<int> >p; //生成全序列 void getPermutation(int arr[], int start, int len){ if(start == len-1){ //显示、保存全序列 vector<int> temp; for(int i = 0;i<len;i++){ temp.push_back(arr[i]); } p.push_back(temp); } for(int i = start;i<len;i++){ swap(arr[start],arr[i]); getPermutation(arr,start+1,len); swap(arr[start],arr[i]); } } vector<vector<int> > getAllPermutation(int arr[], int len){ vector<vector<int> > ret; vector<vector<int> > combinations = getAllCombination(arr,len); for(int i = 0;i<combinations.size();i++){ int tempArr[combinations[i].size()]; for(int j= 0;j<combinations[i].size();j++){ tempArr[j] = combinations[i][j]; } p.clear(); getPermutation(tempArr,0,combinations[i].size()); //ret.insert(ret.end(),p.begin(),p.end()); for(int j = 0;j<p.size();j++){ ret.push_back(p[j]); } } return ret; } }; int main(){ int arr[] = {1,4,8}; Solution s = Solution(); vector<vector<int> > r = s.getAllPermutation(arr,3); for(int i = 0;i<r.size();i++){ for(int j= 0;j<r[i].size();j++){ cout << r[i][j] << "\t"; } cout << endl; } return 0; }