77

给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。

你可以按 任何顺序 返回答案。

示例 1:

输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:

输入:n = 1, k = 1
输出:[[1]]

提示:

1 <= n <= 20
1 <= k <= n

class Solution {
public:
    vector<vector<int>> result;
    vector<int> path;
    //因为要缩减选择范围,所以要用start来确定起始位置
    void backtracking(int n, int k, int start) {
    //当数组中的个数为k时将其push进result得到一组结果
        if(path.size() == k) {
            result.push_back(path);
            return;
        }
    //横向从左到右遍历全部节点
    //此处可以进行剪枝优化,当剩余的节点数总和小于k时就不需再往下遍历了,即i的取值范围为i <= n - (k - path.size()) + 1
        for(int i = start; i <= n; i++) {
            path.push_back(i);
            backtracking(n, k, i + 1);
            //每次递归结束都要撤销处理的节点
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        result.clear();
        path.clear();
        backtracking(n, k, 1);
        return result;
    }
};
posted @ 2023-03-01 20:44  Travelever  阅读(106)  评论(0)    收藏  举报