https://leetcode.cn/problems/combinations/description/

<aside> 💡

回溯三部曲:

vector<int> cur;
vector<vector<int>> ans;

void backtracking(int i, int n, int k) {
    if (cur.size() == k) {
        ans.push_back(cur);
        return;
    }

    for (int j = i; j <= n; ++j) {
        cur.push_back(j);
        backtracking(j + 1, n, k);
        cur.pop_back();
    }
}

vector<vector<int>> combine(int n, int k) {
    backtracking(1, n, k);
    return ans;
}

<aside> 💡

进阶:剪枝:

原循环终止条件:i <= n;

vector<vector<int>> ans;
vector<int> cur;

void backtracking(int num, int& k, int& n) {
		// 终止条件:数组长度为k
		if (cur.size() == k) {
				// 保存结果
				ans.push_back(cur);
				return;
		}
	
		for (int i = num + 1; i <= n - (k - cur.size()) + 1; ++i) {
				// 进行节点操作
				cur.push_back(i);
				// 递归
				backtracking(i, k, n);
				// 还原节点操作(回溯)
				cur.pop_back();
		}
}

vector<vector<int>> combine(int n, int k) { 
		backtracking(0, k, n);
		return ans;
}