Subsets
vector<vector<int>> res; vector<vector<int>> subsets(vector<int>& nums) { vector<int> cur; backtrack(nums,cur,0); return res; } void backtrack(vector<int> &nums, vector<int> &cur, int start){ res.push_back(cur); for (int i=start;i<nums.size();++i){ cur.push_back(nums[i]); backtrack(nums,cur,i+1); cur.pop_back(); } }
Subsets II
有重复元素,先排序。同一层递归中相同元素跳过。
vector<vector<int>> res; vector<vector<int>> subsetsWithDup(vector<int>& nums) { sort(nums.begin(),nums.end()); vector<int> cur; backtrack(nums,cur,0); return res; } void backtrack(vector<int> &nums, vector<int> &cur, int start){ res.push_back(cur); for (int i=start;i<nums.size();++i){ if (i>start && nums[i]==nums[i-1]) continue; cur.push_back(nums[i]); backtrack(nums,cur,i+1); cur.pop_back(); } }
Subsets 时间复杂度
T(n) = T(n-1)+T(n-2)+...+T(1)+T(0) -> T(n) = O(2^n)
如果考虑 res.push_back(cur) 是时间 O(n),那么总的时间复杂度为 O(n*2^n)
====================================================================
Permutations
vector<vector<int>> res; vector<vector<int>> permute(vector<int> &nums) { vector<int> cur; vector<bool> used(nums.size(),false); backtrack(nums,cur,used); return res; } void backtrack(vector<int> &nums, vector<int> &cur, vector<bool> &used){ if (cur.size()==nums.size()){ res.push_back(cur); return; } for (int i=0;i<nums.size();++i){ if (used[i]) continue; cur.push_back(nums[i]); used[i]=true; backtrack(nums,cur,used); cur.pop_back(); used[i]=false; } }
也可以加个start用swap来做。