编写一种方法,返回某集合的所有子集。集合中不包含重复的元素。
说明:解集不能包含重复的子集。
示例:输入: nums = [1,2,3]
输出:
[ [3], [1], [2], [1,2,3], [1,3], [2,3], [1,2], [] ]
方法一(组合问题常用模板):
class Solution { vector<vector<int>> res; vector<int> tmp; public: vector<vector<int>> subsets(vector<int>& nums) { generate(0, nums); return res; } void generate(int i, vector<int>& nums) { res.push_back(tmp); for(int j = i; j < nums.size(); ++j) { tmp.push_back(nums[j]); generate(j+1, nums); tmp.erase(tmp.end()-1); } } };
方法二:
思路:对于[1,2,3]集合,按顺序遍历每个元素,每一步只需考虑加还是不加当前元素。
class Solution { vector<int> tmp; vector<vector<int>> res; public: void backtrack(int i, vector<int>& nums) { if(i >= nums.size()) return; tmp.push_back(nums[i]); //加入当前元素 res.push_back(tmp); backtrack(i+1, nums); tmp.pop_back(); //不加入当前元素 backtrack(i+1, nums); } vector<vector<int>> subsets(vector<int>& nums) { res.push_back(tmp);//先把空集加进去 backtrack(0, nums); return res; } };