思路是穷举->二分(一个数在或者不在解集中)->二叉树->深度优先搜索。
深度优先搜索的迭代函数不太好构造,需要理清逻辑。
class Solution {
public:
vector<vector<int> > combinationSum3(int k, int n) {
vector<vector<int> > res;
vector<int> out;
combinationSum3DFS(k, n, 1, out, res);
return res;
}
void combinationSum3DFS(int k, int n, int level, vector<int> &out, vector<vector<int> > &res) {
if (n < 0) return;
if (n == 0 && out.size() == k) res.push_back(out);
for (int i = level; i <= 9; ++i) {//间接控制迭代次数,这是一个九叉树啊啊啊啊
out.push_back(i);//存储临时vector
combinationSum3DFS(k, n - i, i + 1, out, res);//在这里更新n和level变量
out.pop_back();//更新out变量
}
}
};