这类题的共同点都是用backtracking,建立一个helper API然后recursion
- input nums needs sort,为了方便remove duplicates如果input有duplicates(subsets II)
sort(nums.begin(), nums.end())
helper API有几个共同点:
(跟combinations不一样的是)
- exit condition:
用start == nums.size()作为结束条件,而且只是return。 - push_back to res的时间不一样
在loop里,每次push_back to row,row同时也push_back to res
(跟combinations一样的是) - input:res,row,start
- 如果input candidates有重复元素,需要remove duplicates,
while(i+1 < candidates.size() && candidates[i] == candidates[i+1]) i++;
比如permutation II。
- Subsets
Given a set of distinct integers, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
class Solution {
public:
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>>res;
vector<int>row;
res.push_back(row);
helper(res, row, nums, 0);
return res;
}
void helper(vector<vector<int>>&res, vector<int>& row, vector<int>& nums, int start)
{
if(start == nums.size())
{
return;
}
for(int i = start; i < nums.size(); i++)
{
row.push_back(nums[i]);
res.push_back(row);
helper(res, row, nums, i + 1);
row.pop_back();
}
}
};
- Subsets II
Given a collection of integers that might contain duplicates, nums, return all possible subsets (the power set).
Note: The solution set must not contain duplicate subsets.
class Solution {
public:
vector<vector<int>> subsetsWithDup(vector<int>& nums) {
vector<vector<int>>res;
vector<int>row;
res.push_back(row);
sort(nums.begin(), nums.end());
helper(res, row, nums, 0);
return res;
}
void helper(vector<vector<int>>&res, vector<int>& row, vector<int>& nums, int start)
{
if(start == nums.size())
{
return;
}
for(int i = start; i < nums.size(); i++)
{
row.push_back(nums[i]);
res.push_back(row);
helper(res, row, nums, i + 1);
row.pop_back();
while(i+1 < nums.size() && nums[i] == nums[i+1]) i++;
}
}
};