Subsets
Given a set of distinct integers, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,3]
, a solution
is:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]解析:三种方法都是听经典的方法,递归,迭代,二进制,这道题应该很快写出来的,sad...,对于n个数有2的n次方个结果,n+1的话就把原来的数再加上新的数,之前的保持不变,变成了原来的二倍。
代码:
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>ans;
vector<int>path;
subset(ans,nums,0,path);
return ans;
}
void subset(vector<vector<int>>&ans,vector<int>nums,int begin,vector<int>&path)
{
ans.push_back(path);
for (int i=begin; i<nums.size(); i++)
{
path.push_back(nums[i]);
subset(ans,nums,i+1,path);
path.pop_back();
}
return ;
}
};
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>ans;
vector<int>path;
ans.push_back(path);
for (int i=0; i<nums.size(); i++)
{
int cnt=ans.size();
for (int j=0; j<cnt; j++)
{
path=ans[j];
path.push_back(nums[i]);
ans.push_back(path);
}
}
return ans;
}
};
Subsets II
Given a collection of integers that might contain duplicates, nums, return all possible subsets.
Note: The solution set must not contain duplicate subsets.
For example,
If nums = [1,2,2]
, a solution
is:
[ [2], [1], [1,2,2], [2,2], [1,2], [] ]解析:
由于数组中可能存在重复元素,首先把数组进行排序,在求子数组时,如果当前元素与前一个元素相同则跳过当前元素。
代码:
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>ans;
vector<int>path;
int begin=0;
sort(nums.begin(),nums.end());
dfs(nums,ans,path,begin);
return ans;
}
void dfs(vector<int>&nums,vector<vector<int>>&ans,vector<int>&path,int begin)
{
ans.push_back(path);
int temp=0;
for (int i=begin; i<nums.size(); i++)
{
if ((i!=begin)&&nums[i]==temp)
continue;
path.push_back(nums[i]);
dfs(nums,ans,path,i+1);
temp=path.back();
path.pop_back();
}
return ;
}
};