1 介绍
回溯问题的解决方法就是一个决策树的遍历过程,主要包括3个关键点:
(1) 路径:已经做出的选择;
(2)选择列表:能做出的所有选择的集合;
(3)结束条件:选择列表被用完作为决策树的终止条件;
2 题目
2.1 所有子集
class Solution {
public:
//利用回溯算法
vector<vector<int>> subsets(vector<int>& nums) {
vector<vector<int>> res;
vector<int> track;
backtrack(res, track, 0, nums);
return res;
}
void backtrack(vector<vector<int>>& res, vector<int>& track, int start, vector<int>& nums)
{
res.push_back(track);
for (int i = start; i < nums.size(); ++i)
{
track.push_back(nums[i]);
backtrack(res, track, i + 1, nums);
track.pop_back();
}
}
};
2.2 含有K个元素的组合
class Solution {
public:
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> res;
if (k <= 0 || n <= 0)
{
return res;
}
vector<int> track;
backtrack(res, track, 1, n, k);
return res;
}
void backtrack(vector<vector<int>>& res, vector<int>& track, int start, int n, int k)
{
if (track.size() == k)
{
res.push_back(track);
return ;
}
for (int i = start; i <= n; ++i)
{
track.push_back(i);
backtrack(res, track, i + 1, n, k);
track.pop_back();
}
}
};
2.3
2.4
2.5
2.6
2.7
2.8
2.9
2.10
2.11
2.12