真是有种 “x了狗了”的感觉,DFS这里总是充满了各种各样的问题
最后写的代码可读性和复杂度都差得厉害,虽然AC:
class Solution {
public:
void solve(int index,int cur,vector<int> &res,vector<vector<int> >&ans,vector<int>& num,int k)
{
if(index==k)
{
ans.push_back(res);
return;
}
for(int i=cur;i<num.size();i++)
{
res.push_back(num[i]);
//index++; //如果一开始按照index++的思路写,会影响for循环之后的多次递归,所以用index+1代替
solve(index+1,i+1,res,ans,num,k);
res.pop_back();
}
}
vector<vector<int> > combine(int n, int k) {
vector<vector<int> > ans;
vector<int> res;
vector<int> num;
for(int i=0;i<n;i++)
num.push_back(i+1);
solve(0,0,res,ans,num,k);
return ans;
}
};
好吧,就在这篇文章之后继续做DFS,发现subsets和subsets2可以按照之前写的框架写:
传送门:
https://leetcode.com/problems/subsets/
其中每一次进行递归时都会产生新的集合,直接加进去就好
class Solution {
public:
void solve(int index,int cur,vector<int> &res,vector<vector<int> >&ans,vector<int>& num)
{
ans.push_back(res);
for(int i=cur;i<num.size();i++)
{
res.push_back(num[i]);
//index++;
solve(index+1,i+1,res,ans,num);
res.pop_back();
}
}
vector<vector<int> > subsets(vector<int> &S) {
vector<vector<int> > ans;
vector<int> res;
//vector<int> num;
sort(S.begin(),S.end());
solve(0,0,res,ans,S);
return ans;
}
};
subsets2:
多加一个判定函数就好
传送门:https://leetcode.com/problems/subsets-ii/
AC代码:
class Solution {
public:
bool check(vector<int> &s,vector<vector<int> >&ans)
{
for(int k=0;k<ans.size();k++)
if(ans[k]==s) return false;
return true;
}
void solve(int index,int cur,vector<int> &res,vector<vector<int> >&ans,vector<int>& num)
{
if(check(res,ans))
ans.push_back(res);
for(int i=cur;i<num.size();i++)
{
res.push_back(num[i]);
//index++;
solve(index+1,i+1,res,ans,num);
res.pop_back();
}
}
vector<vector<int> > subsetsWithDup(vector<int> &S) {
vector<vector<int> > ans;
vector<int> res;
//vector<int> num;
sort(S.begin(),S.end());
solve(0,0,res,ans,S);
return ans;
}
};