参考链接
- https://leetcode-cn.com/problems/power-set-lcci/
题目描述
幂集。编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
说明:解集不能包含重复的子集。
解题思路
数学归纳
前n个元素的子集 = 前n-1个元素的子集+所有子集再添加第n个元素。但会超过内存限制。
回溯法
就是穷举。比如对于[1, 2, 3],先确定以1开头的子集,再确定以2开头的子集,…,当然还有空集。以1开头确定后,就递归到对于[2, 3]求子集,以此类推。
代码
数学归纳
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
if (nums.empty())
{
return {{}};
}
int n = nums.back();
nums.pop_back();
vector<vector<int>> res = subsets(nums);
for (int i = 0; i < res.size(); i ++)
{
res.push_back(res[i]);
res.back().push_back(n);
}
return res;
}
};
回溯法
class Solution {
public:
vector<vector<int>> res;
vector<vector<int>> subsets(vector<int>& nums) {
vector<int> track;
backtrack(nums, 0, track);
return res;
}
void backtrack(vector<int>& nums, int start, vector<int>& track)
{
res.push_back(track);
for (int i = start; i < nums.size(); i ++)
{
track.push_back(nums[i]);
backtrack(nums, i + 1, track);
track.pop_back();
}
}
};