组合

题目

给定两个整数 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

思路

  • 这题目是一个典型的回溯的题型,主要是要理解这里的stratIndex是干嘛的,是为了不让你回头去搜索已经选过的元素
  • 加一个剪枝的操作,还还需要选择的元素是k - path.size(),剩下还有n - i个元素,所以需要满足k - path.size() <= n - i,即i <= n - k + path.size(),
    要记得加上1,因为包含了初始位置,可以举个例子 n = 4, k = 3,path.size() = 0,那么这个时候第一个元素最多达到2的位置,即取得[2, 3, 4]

代码

class Solution {
private:
    vector<vector<int>> result; // 存放符合条件结果的集合
    vector<int> path; // 用来存放符合条件结果
    void backtracking(int n, int k, int startIndex) {
        if (path.size() == k) {
            result.push_back(path);
            return;
        }
        for (int i = startIndex ; i <= n - k +       
             path.size()+1; //这里做了剪枝的操作
             i++) {
            path.push_back(i); // 处理节点
            backtracking(n, k, i + 1); 
            // 注意这里是i+1,如果是startIndex会出现重复
            path.pop_back(); // 回溯,撤销处理的节点
        }
    }
public:
    vector<vector<int>> combine(int n, int k) {
        result.clear(); // 可以不写
        path.clear();   // 可以不写
        backtracking(n, k, 1);
        return result;
    }
};
posted @ 2023-04-04 12:54  铜锣湾陈昊男  阅读(4)  评论(0)    收藏  举报