78. Subsets
Medium
163241FavoriteShare
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.暴力搜索;2.位运算
先说一下位运算的方法:
位运算的规则如下:
位运算的思路如下:
假设一个集合有3个不同的元素A,B,C,则3个元素有2^3 = 8 个子集,用0-7表示这些集合
A 元素为 100 = 4; B元素为010 = 2; C元素为001 = 1
若要构造某个集合,即使用A,B,C对应的三个整数与该集合对应的整数做&运算,当为真时,将该元素push进集合
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector <vector<int> > result;
vector <int> vec;
int all = 1 << (nums.size());//构造所有子集
for (int i = 1; i <= all; i++){
for (int j = 0; j < nums.size(); j++){
if(i & (1 << j)){//检查每个子集中包含的元素
vec.push_back(nums[j]);
}
}
result.push_back(vec);
vec.clear();
}
return result;
}
};
方法二:暴力搜索
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> item;
vector<vector<int> > result;
result.push_back(item);
generate(0,nums,item,result);
return result;
}
private:
void generate(int i,vector<int>& nums,vector<int>& item,vector<vector<int> >&result){
if(i >= nums.size()){
return;
}
item.push_back(nums[i]);
result.push_back(item);
generate(i+1,nums,item,result);
item.pop_back();
generate(i+1,nums,item,result);
}
};