组合问题(回溯算法)
本文参考代码随想录
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例: 输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
思路
class Solution {
private:vector<vector<int>> result;vector<int> path; // 存放当前正在处理的结果void backTracking(int n, int k, int startIndex){// 从左向右取数,使用startIndex避免重复if(path.size() == k){result.push_back(path);return;}for(int i = startIndex; i <= n; i++){path.push_back(i);backTracking(n, k, i + 1);path.pop_back();// 撤销当前处理}}
public:vector<vector<int>> combine(int n, int k) {result.clear();path.clear();backTracking(n, k, 1);//从1开始取数return result;}
};
剪枝优化
当n = 4,k = 4的话,那么第一层for循环的时候,从元素2开始的遍历都没有意义了。 在第二层for循环,从元素3开始的遍历都没有意义了。
可以通过for循环时指定循环终止条件实现剪枝。
for (int i = startIndex; i <= n - (k - path.size()) + 1; i++) // i为本次搜索的起始位置