LeetCode 78. Subsets
方法一:Backtracing (DFS)
非常典型的回溯,必须烂熟于心。
class Solution { public: vector<vector<int>> res; vector<vector<int>> subsets(vector<int>& nums) { vector<int> cur; dfs(nums,0,cur); return res; } void dfs(vector<int>& nums, int index, vector<int> &cur){ res.push_back(cur); for (int i=index;i<nums.size();++i){ cur.push_back(nums[i]); dfs(nums,i+1,cur); cur.pop_back(); } }
方法二:迭代
把当前的结果vector里的所有元素 都加上当前的元素 push_back
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { vector<vector<int>> subs(1, vector<int>()); for (int i = 0; i < nums.size(); i++) { int n = subs.size(); for (int j = 0; j < n; j++) { subs.push_back(subs[j]); subs.back().push_back(nums[i]); } } return subs; } };
方法三:Bit Manipulation
https://leetcode.com/problems/subsets/discuss/27278/C++-RecursiveIterativeBit-Manipulation
class Solution { public: vector<vector<int>> subsets(vector<int>& nums) { int n = pow(2, nums.size()); vector<vector<int>> subs(n, vector<int>()); for (int i = 0; i < nums.size(); i++) { for (int j = 0; j < n; j++) { if ((j >> i) & 1) { subs[j].push_back(nums[i]); } } } return subs; } };

浙公网安备 33010602011771号