Subsets
题目大意
给你一个不同整数组成的集合,返回其所有子集。
我的解法
解题思路
使用深度遍历,如下图所示:
从空集开始访问,依次按深度遍历
代码
class Solution {
public:
void dfs(int depth, vector<vector<int> >& result, vector<int>& oneturn,vector<int> nums)
{
for(int i=depth;i<nums.size();i++)
{
vector<int> temp = oneturn;
temp.push_back(nums[i]);
result.push_back(temp);
dfs(i+1 , result, temp,nums);
}
}
vector<vector<int> > subsets(vector<int>& nums) {
vector<int> oneturn = {};
vector<vector<int> > result;
result.push_back(oneturn);
dfs(0,result,oneturn,nums);
return result;
}
};
优解
解题思路一
使用迭代的方式:
初始化:[[]]
加入第一个元素:[[ ], [1]]
加入第二个元素:[[ ], [1], [2], [1,2]]
加入第三个元素:[[ ], [1], [2], [1,2], [3], [1,3], [2,3], [1,2,3]]
代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > result ={};
vector<int> init = {};;
result.push_back(init);
for(int i=0;i<nums.size();i++)
{
int len = result.size();
for(int j=0;j<len;j++)
{
result.push_back(result[j]);
result.back().push_back(nums[i]);
}
}
return result;
}
};
解题思路二
给出所有可能的子集,只需要判断每个元素在或者不在该子集中,如下所示
[ [] [] [] [] [] [] [] [] ]
[ [] [1] [] [1] [] [1] [] [1]]
[ [] [1] [2] [1,2] [] [1] [2] [1,2]]
[ [] [1] [2] [1,2] [3] [1,3] [2,3] [1,2,3]]
代码
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int num_subset = pow(2, nums.size());
vector<vector<int> > res(num_subset, vector<int>());
for (int i = 0; i < nums.size(); i++)
for (int j = 0; j < num_subset; j++)
if ((j >> i) & 1)
res[j].push_back(nums[i]);
return res;
}
};