终其一生,你在追求什么?
——2024年6月16日11:56
题目描述
给定正整数n(n≥1),给出求{1~n}的幂集,例如,n=3时,{1,2,3}对应的幂集合为{{},{1},{2},{3},{1,2},{1,3},{2,3},{1,2,3}},输出不分顺序。
题解思路
归纳法+迭代法
本题和我的上一篇博客:全排列的C++实现-CSDN博客解题思路相似,可以参考一下。
1. 当n=1时,{1}对应的幂集{{},{1}};
2. 当n=2时,{1,2}对应的幂集{{},{1}}∪{{2},{1,2}};
3. 当n=3时,{1,2,3}对应的幂集是{{},{1},{2},{1,2}}∪{{3},{1,3},{2,3},{1,2,3}};
……
规律是什么?
当n=2时,2的幂集是在1的幂集中插入了元素2之后再与1的幂集并起来的;
当n=3时,3的幂集是在2的幂集中插入了元素3之后再与2的幂集并起来的;
代码思路
1. 对于n=1时,可直接将其初始化为{{},{1}}并直接输出,当n大于1时则再1的基础上不断更新;
2. 数字每增加1,就需要在上一次的结果中逐个遍历并插入当前数字,比如,当n=2时,在已经初始化之后的结果{{},{1}}中逐个遍历并插入数字2,得到{{2},{1,2}},在将结果插入到{{},{1}}中得到{{},{1},{2},{1,2}}以便下次更新插入3;
那么请根据代码思路自己实现一下吧!
方式一:非递归实现
vector<vector<int>> getMiji(int n){
vector<vector<int>> res = {{}, {1}};
if(n == 1){
return res;
}
for(int i = 2; i <= n; i++){
vector<vector<int>> tmp = res;
for(auto e:tmp){
e.push_back(i);//对上次的结果插入当前数字
res.push_back(e);//更新结果
}
}
return res;
}
方式二:递归实现
vector<vector<int>> getMiji(vector<vector<int>> &res, int n){
if(n == 1){
return {{}, {1}};
}
res = getMiji(res, n-1);
vector<vector<int>> tmp = res;
for(auto e:tmp){
e.push_back(n);
res.push_back(e);
}
return res;
}
结果展示
题目变式
如果对给定的集合求幂集呢?比如给定一个集合为{2,4,6},怎么求它的幂集,欢迎大家积极尝试,本题为LeetCode78题,附递归代码如下:
// 获取指定集合中的幂集
#include<iostream>
#include<vector>
using namespace std;
vector<vector<int>> getMiji(vector<vector<int>> &res, vector<int> &v, int len){
// len是v的初始长度
if(len == 1){
return {{}, {v[0]}};
}
res = getMiji(res, v, len - 1);
vector<vector<int>> tmp = res;
for(auto e:tmp){
e.push_back(v[len-1]);
res.push_back(e);
}
return res;
}
int main(){
vector<int> v = {2, 4, 6};
vector<vector<int>> res;
res = getMiji(res, v, 3);
for(auto e:res){
for(auto m:e){
cout<<m<<'\t';
}
cout<<endl;
}
cout<<"幂集中的元素个数为"<<res.size()<<"个";
return 0;
}