题目:
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
Example:
Input: nums = [1,2,3]
Output:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
代码:
1——(比较蠢的递归)
class Solution {
private:
vector< vector<int> > res;
public:
vector<vector<int>> subsets(vector<int> nums) {
sort(nums.begin(), nums.end());
vector<vector<int>>::iterator ret = std::find(res.begin(), res.end(), nums);
if (ret != res.end())return res;
res.push_back(nums);
int len = nums.size();
for (int i = 0; i < len; i++) {
int temp = nums[i];
swap(nums[i], nums[len - 1]);
nums.pop_back();
subsets(nums);
nums.push_back(temp);
swap(nums[i], nums[len - 1]);
}
return res;
}
};
2——(不用递归)
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int> > res(1);
sort(nums.begin(), nums.end());
for (int i = 0; i < nums.size(); ++i) {
int size = res.size();
for (int j = 0; j < size; ++j) {
res.push_back(res[j]);
res.back().push_back(nums[i]);
}
}
return res;
}
};
3——(巧妙的办法,用位操作)
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
sort(nums.begin(), nums.end());
int elem_num = nums.size();
int subset_num = pow (2, elem_num);
vector<vector<int>> subset_set(subset_num, vector<int>());
for (int i = 0; i < elem_num; i++)
for (int j = 0; j < subset_num; j++)
if ((j >> i) & 1)
subset_set[j].push_back(nums[i]);
return subset_set;
}
};