解题思路
result[][]
存放结果,path[]
存放当前所选择的值,index
代表当前所选的值。
回溯法代码总体框架:
void Backtricking(//参数)
{
if(//递归终止条件)
{
//保存结果
return;
}
//递归
//回溯
}
- 由递归树可知,终止条件是path.size()==k,
- 把每一次要选的值先放入path中
- 递归,选择下一个值到path中
- 弹出最后放进的一个值,回到没选这个值的状态,去选择其他值。
剪枝策略
当path.size()+剩下的所有值<k
时可以知道这支没必要要了。
剩下的所有值为n-index+1
代码如下:
class Solution {
public:
vector<int>path;//存放当前所选择的数
vector<vector<int>>result;//存放最后的结果
vector<vector<int>> combine(int n, int k) {
Backtricking(n,k,1);
return result;
}
void Backtricking(int n,int k,int index)
{
if(path.size()+n-index+1<k)return;//剪枝策略
if(path.size()==k)//递归终止条件
{
result.push_back(path);//保存结果
return;
}
for(int i=index;i<=n;i++)
{
path.push_back(i);//先把i放进path中
Backtricking(n,k,i+1);//去选择i的下一个值放入path中
path.pop_back();//回溯
}
}
};
所有路径
居然忘记了经典回溯算法的过程
代码
class Solution {
public:
vector<vector<int>> ans;
vector<int> tmp;
int n;
void dfs(vector<vector<int>>& graph,int x){
if(x == n - 1){
ans.push_back(tmp);
return;
}
for(auto i : graph[x]){
tmp.push_back(i);
dfs(graph,i);
tmp.pop_back();
}
return;
}
vector<vector<int>> allPathsSourceTarget(vector<vector<int>>& graph) {
n = graph.size();
tmp.push_back(0);
dfs(graph,0);
return ans;
}
};