跳转至

77. 组合

力扣链接(中等):https://leetcode.cn/problems/combinations

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

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

示例 1:

Text Only
输入:n = 4, k = 2
输出:
[
  [2,4],
  [3,4],
  [2,3],
  [1,2],
  [1,3],
  [1,4],
]

示例 2:

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

提示:

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

个人题解

C++
class Solution {
public:
    vector<int> path;   // 一条路径,代表一个结果
    vector<vector<int>> result; // 总结果

    // begin 表示每次从哪一个数开始遍历
    void backtracking(int n, int k, int begin) {
        // 已经到叶子了,完成一条结果
        if(path.size() == k) {
            result.push_back(path);
            return;
        }

        // 开始遍历一层 for(int i = begin; i <= n; i++)
        // 这里可以进行剪枝,因为如果从开始遍历的位置到结束位置的个数如果不满足 k<=n-i+path.size()+1
        // 那么无论如何也不能形成长度为 k 的完整路径,没有遍历的必要
        for(int i = begin; i <= n - (k - path.size()) + 1; i++) {
            path.push_back(i);
            backtracking(n, k, i + 1);
            // 递归完成后,代表完成了一条路径,那么这时候应该 back 到上一层,继续下一条路径
            path.pop_back();
        }
    }
    vector<vector<int>> combine(int n, int k) {
        backtracking(n, k, 1);
        return result;
    }
};