给定两个整数 n 和 k,返回 1 ... n 中所有可能的 k 个数的组合。
敲定回溯算法,
输入: n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
这个例子可以看出,深度为2时,进行回溯。回溯的过程:
- 1,2,3,4
- 2,3,4
- 3,4
当前位置为i时,下次回溯就要从i + 1的位置开始,否则会造成重复
void backtrack(vector<vector<int>> &res, vector<int> &nums, vector<bool> &used, vector<int> &temp, int begin, int k, int count){
if(count == k){
res.push_back(temp);
return;
}
for(int i = begin; i < nums.size(); i++){
if(!used[i]){
used[i] = true;
temp.push_back(nums[i]);
backtrack(res, nums, used, temp, i + 1, k, count + 1);
temp.pop_back();
used[i] = false;
}
}
}
vector<vector<int>> combine(int n, int k) {
vector<int> nums(n);
vector<vector<int>> res = {};
vector<bool> used(n, false);
vector<int> temp = {};
for(int i = 0; i < n; i++){
nums[i] = i + 1;
}
backtrack(res, nums, used, temp, 0, k, 0);
return res;
}