全排列和组合的DFS的框架很相似,但是在每个位置上选择的方案有所不同。
DFS的模板:
if(...)
{
...
return;
}
//退出条件
for(...)
{
...
DFS()
...
}
//for是选择列表
全排列和组合的区别就在于选择列表上!组合在上一个位置选择过后,不能再往回看,只能将选择列表限制在除了前面遍历过之外的; 而全排列则可以继续从头选起,只要该选择没有选过!
组合
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
vector<int> tmp;
DFS(n,k,0,res,tmp);
return res;
}
void DFS(int n,int k, int start, vector<vector<int>> &res, vector<int> &tmp)
{
if(tmp.size() == k)
{
res.push_back(tmp);
return;
}
for(int i=start;i<n;i++)
{
tmp.push_back(i+1);
DFS(n,k,i+1,res,tmp);
tmp.pop_back();
}
}
};
全排列
class Solution {
public:
vector<vector<int>> permute(vector<int>& nums) {
vector<vector<int>> res;
vector<int> tmp;
DFS(nums,tmp,res);
return res;
}
void DFS(vector<int> &nums,vector<int> &tmp, vector<vector<int>> &res)
{
if(tmp.size() == nums.size())
{
res.push_back(tmp);
return;
}
for(int i=0;i<nums.size();i++)
{
if(find(tmp.begin(),tmp.end(),nums[i])==tmp.end())
{
tmp.push_back(nums[i]);
DFS(nums,tmp,res);
tmp.pop_back();
}
}
}
};