[英]return subsets of an array using recursion c++
嗨,伙計們,我被一個問題困住了很長一段時間 - 這是 -
問題 --- 給定一個大小為 n 的數組,找到並返回該數組的所有子集......遞歸地執行此操作
我的方法- 考慮一個大小為 3 - {10,11,12} 的數組。 考慮第一個元素 - 我有兩個選擇要么不接受。 所以我為第一個元素工作,讓回避做剩下的事情。
int helper(int in[],int si,int n,int output[][20]){
//si - starting index , n - size
if(si == n){
output[0][0] = 0; //using 0 for null
return 1; //helper returns the number of subsets of array
}
int smallSize = helper(in,si+1,n,output);
for(int i =0;i<smallSize;i++){
output[i+smallSize][0] = in[si];
for(int k = 0;k<4;k++){
output[i+smallSize][k+1] = output[i][k];
}
}
return smallSize*2;
}
int subset(int input[], int n, int output[][20]) {
return helper(input,0,n,output);
}
我想將所有子集存儲在二維數組輸出中並返回子集的數量。
我似乎得到了零?
你的基本情況是不正確的。 它必須代表一個空數組。 不確定您是否可以使用本機數組數據結構執行此操作。
一般來說,有多種方法可以解決“所有子集”(或“所有組合”問題)。 谷歌搜索“一組的所有組合”(以及相關的“列表的所有排列”)以獲取其他方式。
這些類型的問題具有指數復雜性(對於排列,它是階乘復雜性),因此請注意 N 的輸入大小。
您的想法是正確的,但是由於您使用的是本機數組,因此缺少一些東西。 既然你已經標記了 C++,那么如果你使用 STL,它會讓生活變得更輕松。
這是遞歸執行的一種方法:
vector<vector<int> > AllCombinations(vector<int> input) {
//base case
if(0 == input.size()) {
//1 element of empty/null set
return vector<vector<int> >(1, vector<int>());
}
//recursion case
const int last = input.back();
input.pop_back();
vector<vector<int> > result = AllCombinations(input);
result.reserve(result.size() * 2);
//add last element to previous result
const size_t resultSize = result.size();
for(size_t i = 0; i < resultSize; ++i) {
vector<int> tmp = result[i];
tmp.push_back(last);
result.push_back(tmp);
}
return result;
}
復雜度: O(2^N)
不需要使用 Si 變量。 下面給出的是正確的代碼。 我假設空值為 0 並將每行(即子集)的大小存儲在第 0 列,因此結果從每一行的第 1 列開始。
int subset(int input[], int n, int output[][20]) {
// Write your code here
if(n<=0) {
output[0][0]=0;
return 1;
}
int smallOutput = subset(input+1,n-1,output);
for(int i=0;i<smallOutput;i++) {
int col = output[i][0] +1;
output[i+smallOutput][0] = col;
output[i+smallOutput][1] = input[0];
for(int j=2; j<col+1;j++) {
output[i+smallOutput][j] = output[i][j-1];
}
}
return 2*smallOutput;
}
int subset(int input[], int n, int output[][20]) {
if (n==0)
{
output[0][0]=0;
return 1;
}
int count=subset(input+1,n-1,output);
int i,j;
for(i=0;i<count;i++){
output[count+i][0]=output[i][0]+1;
output[count+i][1]=input[0];
}
for(i=0;i<count;i++){
for(j=1;j<output[count+i][0];j++){
output[count+i][j+1]=output[i][j];
}
}
return 2*count;
}
這是我的方法:-
int subset(int input[], int n, int output[][20]) {
if(n<=0){
output[0][0]=0;
return 1;
}
int smallOutputSize = subset(input+1, n-1, output);
for(int i=0; i<smallOutputSize; i++){
output[i+smallOutputSize][0]=output[i][0]+1;
for(int j=(output[i][0]+1); j>1;j--){
output[i+smallOutputSize][j]=output[i][j-1];
}
output[i+smallOutputSize][1]=input[0];
}
return 2*smallOutputSize;
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.