leetcode 78. 子集
问题描述
给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集)。
说明:解集不能包含重复的子集。
示例:
输入: nums = [1,2,3]
输出:
[
[3],
[1],
[2],
[1,2,3],
[1,3],
[2,3],
[1,2],
[]
]
代码
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
if(n == 0)return ans;
vector<int> path;
//vector<bool> flag(n,false);
//ans.push_back(nums);
//ans.push_back(path);
//for(int size = 1; size < n; size++)
{
backtrack(ans,path,nums,n,0);
}
return ans;
}
void backtrack(vector<vector<int>>&ans,vector<int>&path,vector<int>&nums,int n,int level)
{
if(path.size() <= n)
{
ans.push_back(path);
//return;
}
for(int i = level; i < n; ++i)
{
//if(!flag[i])
{
// flag[i] = true;
path.push_back(nums[i]);
backtrack(ans,path,nums,n,i+1);
path.pop_back();
//flag[i] = false;
}
}
}
};
结果
执行用时 :4 ms, 在所有 cpp 提交中击败了99.74%的用户
内存消耗 :8.9 MB, 在所有 cpp 提交中击败了88.41%的用户
代码
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
if(n == 0)return ans;
vector<int> path;
//vector<bool> flag(n,false);
ans.push_back(nums);
ans.push_back(path);
for(int size = 1; size < n; size++)
{
backtrack(ans,path,nums,0,size);
}
return ans;
}
void backtrack(vector<vector<int>>&ans,vector<int>&path,vector<int>&nums,int start,int size)
{
if(size == 0)
{
ans.push_back(path);
//return;
}
for(int i = start; i < nums.size(); ++i)
{
//if(!flag[i])
{
// flag[i] = true;
path.push_back(nums[i]);
backtrack(ans,path,nums,i+1,size-1);
path.pop_back();
//flag[i] = false;
}
}
}
};
结果
执行用时 :8 ms, 在所有 cpp 提交中击败了85.74%的用户
内存消耗 :8.9 MB, 在所有 cpp 提交中击败了87.93%的用户
//剪枝
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
int n = nums.size();
vector<vector<int>> ans;
if(n == 0)return ans;
vector<int> path;
//vector<bool> flag(n,false);
ans.push_back(nums);
ans.push_back(path);
for(int size = 1; size < n; size++)
{
backtrack(ans,path,nums,0,size);
}
return ans;
}
void backtrack(vector<vector<int>>&ans,vector<int>&path,vector<int>&nums,int start,int size)
{
if(size == 0)
{
ans.push_back(path);
return;
}
for(int i = start; i < nums.size() - size + 1; ++i)
{
//if(!flag[i])
{
// flag[i] = true;
path.push_back(nums[i]);
backtrack(ans,path,nums,i+1,size-1);
path.pop_back();
//flag[i] = false;
}
}
}
};
结果:
执行用时 :4 ms, 在所有 cpp 提交中击败了99.74%的用户
内存消耗 :8.9 MB, 在所有 cpp 提交中击败了86.95%的用户