链接:https://leetcode-cn.com/problems/combinations/submissions/
回溯法基本框架:
result = []
function backtrack(路径, 选择列表):
if 满足结束条件:
result.add(路径)
return
for 选择 in 选择列表:
做选择
backtrack(路径, 选择列表)
撤销选择
注意用java做回溯法的题目不能直接将当前List加到答案中去
java代码:
class Solution {
List<List<Integer>> ans= new ArrayList();
List<Integer>temp = new ArrayList();
public List<List<Integer>> combine(int n, int k) {
backtrack(n,k,1);
return ans;
}
private void backtrack(int n,int k,int begin)
{
if(k==0)
{
ans.add(new ArrayList<>(temp));
return;
}
for(int i = begin;i<=n-k+1;i++)
{
temp.add(i);
backtrack(n,k-1,i+1);
temp.remove(temp.size()-1);
}
}
}
C++代码:
class Solution {
public:
vector<vector<int>>ans;
vector<vector<int>> combine(int n, int k) {
vector<int>temp;
help(n,k,0,temp);
return ans;
}
void help(int n,int k,int begin,vector<int>&temp)
{
if(temp.size()==k)
{
ans.push_back(temp);
return;
}
for(int i = begin+1;i<=n;i++)
{
temp.push_back(i);
help(n,k,i,temp);
temp.pop_back();
}
}
};