class Solution
{
private:
vector<vector<int>> result;
vector<int> nums;
void backtracking(int n, int k, int startIndex)
{
if (nums.size() == k)
{
result.push_back(nums);
return;
}//找到的元素个数等于k了就可以返回了
for (int i = startIndex;i<=n;i++){
nums.push_back(i);
backtracking(n,k,i+1);//递归找下一个元素
nums.pop_back();//回溯,最后的一个元素,然后进入下一轮循环去找新的元素放在最后。
//走到这一步证明上一步的递归已经遇到return了,也就意味着已经找到第一个符合要求的数据了
}
}
public:
vector<vector<int>> combine(int n, int k)
{
result.clear();
nums.clear();
backtracking(n,k,1);
return result;
}
};
回溯算法,一种暴力的解法。精妙在于用递归实现,可以不用嵌套多层for循环写繁杂的代码,递归套娃下去就行。
这道题的妙处在于一个nums.pop_back()。因为可以撤销数组最后一个元素,然后进入下一轮循环,通过递归找新的元素。
回溯算法可以解决组合、切割、子集、排列和棋盘问题。