Every day a AcWing
题目来源:93. 递归实现组合型枚举
解法1:回溯算法
标准的回溯算法模板题。
如果把 n、m 和数组 nums 都设置成全局变量的话,backtracking 回溯函数可以只用一个参数 level。
注意传参时 nums 不能用引用,确保不同递归分支的 nums 有不同的副本,互相独立。
代码:
#include <iostream>
#include <vector>
using namespace std;
void PrintVector(vector<int> &vec);
void backtracking(int n, int m, int level, vector<int> nums);
int main()
{
int n, m;
cin >> n >> m;
vector<int> nums;
backtracking(n, m, 1, nums);
system("pause");
return 0;
}
void backtracking(int n, int m, int level, vector<int> nums)
{
if (nums.size() > m)
return;
if (nums.size() + (n - level + 1) < m)
return;
if (level == n + 1)
{
PrintVector(nums);
return;
}
nums.push_back(level);
backtracking(n, m, level + 1, nums);
nums.pop_back();
backtracking(n, m, level + 1, nums);
}
void PrintVector(vector<int> &vec)
{
for (int i = 0; i < vec.size(); i++)
{
cout << vec[i];
if (i != vec.size() - 1)
cout << " ";
}
cout << endl;
}
结果:
复杂度分析:
时间复杂度:O(m),打印数组需要 O(m) 的时间。
空间复杂度:O(n),递归深度最大为 n+1。