组合问题-子集
2023-08-26 本文已影响0人
1哥
题目一
给出一个数组 list = [1,2,3,4,5,6]
求此数组的所有子集合
输出:[1],[1,2],[1,2,3]…
位运算法
2^n 种子集合:每种子集合中每一个bit 代表 数组中index 对应的元素是否在子集合中。
遍历每个2^n 中情况,通过对应的数值,获取对于的元素,然后push_back 到vector 数组中。
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> result; //开辟二维数组
int all_set = 1 << nums.size(); //所有的可能数 +1
for(int i = 0; i < all_set; i++){
vector<int> item; //开辟一维数组
for(int j = 0; j < nums.size(); j++){
if(i & (1 << j)){ //某位置元素是否存在的条件
item.push_back(nums[j]);
}
}
result.push_back(item);
}
return result;
}
题目二
给出一个数组 list = [1,2,3,4,5,6]
求此数组的所有子集合中和为6的子集
输出:[6,[2,4],[1,5],[1,2,3]
解题思路:
vector<vector<int>> subsets(vector<int>& nums, int target ) {
vector<vector<int>> result; //开辟二维数组
int all_set = 1 << nums.size(); //所有的可能数 +1
for(int i = 0; i < all_set; i++){
vector<int> item; //开辟一维数组
int sum = 0;
for(int j = 0; j < nums.size(); j++){
if(i & (1 << j)){ //某位置元素是否存在的条件
item.push_back(nums[j]);
sum += nums[j];
}
}
if (sum == target)
result.push_back(item);
}
return result;
}