6.3Combinations -- 回溯法
题目描述
给定一个整数n和另一个整数k,在1到n中选取k个数组的所有组合方法
输入输出样例
Input : n = 4 , k = 2
Output:[ [1 , 2], [1 , 3], [1 , 4], [2 , 3], [2 , 4], [3 , 4] ]
输出的二维数组可以以任意顺序输出
题解
发现了不,基本上所有找组合、排列问题,都用回溯法是较为方便的。
排列回溯是交换位置然后记录,回溯,接着交换。
组合回溯是 是否把当前数字加入到结果中。
cpp
#include <vector>
#include <iostream>
using namespace std;
void backtracking(vector<vector<int>>& ans, vector<int>& comb,
int& count, int pos, int n, int k) {
if (count == k) {
ans.push_back(comb);
return;
}
for (int i = pos; i <= n; ++i) {
comb[count++] = i; //修改当前节点
backtracking(ans, comb, count, i + 1, n, k); //递归子节点
--count; //回改当前节点状态
}
}
vector<vector<int>> combine(int n , int k) {
vector<vector<int>> ans;
vector<int> comb(k, 0);
int count = 0;
backtracking(ans, comb, count, 1, n, k);
return ans;
}
int main() {
int n = 4, k = 2;
vector<vector<int>> res = combine(n, k);
cout << "[";
for (int i = 0; i < res.size(); ++i) {
if (i > 0) cout << ", ";
cout << "[" << res[i][0] << ", "
<< res[i][1] << "]";
}
cout << "]" << endl;
return 0;
}