使用递归 C++ 返回数组的子集
return subsets of an array using recursion c++
嗨,伙计们,我在一个问题上被困了很长时间了——在这里-
问题 ---给定一个大小为 n 的数组,查找并返回此数组的所有子集 数组。。。。递归执行此操作
我的方法 - 考虑大小为 3 的数组 - {10,11,12}。考虑第一个元素 - 我有 2 个选项可以不接受它。所以我确实为第一个元素工作,让回避完成其余的工作。
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 变量。下面给出的正确代码。我假设 null 值为 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;
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 将数组的地址分配给变量并删除
- 从C++本机插件更新Vector3数组
- lambda参数转换为constexpr技巧,然后获取带链接的数组
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 数组索引的值没有增加
- 将对象数组的引用传递给函数
- 为char数组调整zlib-zpipe
- 2D数组来自文本输入,中间有空格
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- 使用strcpy将char数组的元素复制到另一个数组
- 将函子应用于设备数组的子集的最有效方法是什么
- 使用递归 C++ 返回数组的子集
- 指向数组子集的智能指针(c++11)
- C#中数组/列表的子集迭代器,没有屈服
- 给定一个长度为n的数组,找到子集的数量,其中子集的XOR等于给定数量
- 获取数组的稀疏子集作为引用
- 如何在c++中生成给定数组的子集
- 查找数组的子集数,这些子集加起来是特定数字的倍数