组合
题目
题目解析
1.我们可以根据题目分析可知,题目所要求我们做的是:从1到n进行遍历,找出k个数组成小组合,再将小组合拼接在一起成为大组合输出。
2.所以,根据题目,我们可以采用两个数组,一个一维数组temp,负责存储k个数,组为小组合,一个二维数组res,存储小组合,变为大组合。
下面为图解:
3.这道题动用了回溯法(有递归即会出现回溯),想要了解的可以点击下面的链接:
4.这题可以动用容器,我们可以把容器看为一个动态扩展的数组,想要了解容器的可以点击下面链接:
代码:
#include<iostream> #include<vector> using namespace std; class Solution { vector<vector<int>> res;//二维数组 vector<int> temp;//一位数组 保存临时组合 public: void recursion(int i, int n, int k)//从i遍历到n,寻找长度为k的数组 { if (temp.size() == k) { res.push_back(temp);//将当前组合添加到res } else if (i <= n) { temp.push_back(i);//在容器后添加一个元素 recursion(i + 1, n, k); temp.pop_back();//删除添加的尾元素 recursion(i + 1, n, k); } } vector<vector<int>> combine(int n, int k) { recursion(1, n, k); return res; } };
代码调试解析:
想要理解上面的代码,可以运行下面的代码,必要时可以打断点进行调试:
#include <iostream> #include <vector> using namespace std; class Solution { public: vector<vector<int>> combine(int n, int k) { recursion(1, n, k); return res; } private: vector<vector<int>> res; // 存储所有组合的结果 vector<int> temp; // 存储当前组合 void recursion(int i, int n, int k) { // 打印当前递归的状态 cout << "递归调用: i = " << i << ", n = " << n << ", k = " << k << ", 当前组合: "; for (int num : temp) { cout << num << " "; } cout << endl; // 如果当前组合的长度等于k,则将其添加到结果中 if (temp.size() == k) { res.push_back(temp); // 打印找到的组合 cout << "找到一个组合: "; for (int num : temp) { cout << num << " "; } cout << endl; return; // 返回,避免进一步递归 } // 如果还有数字可以加入组合,则继续递归 if (i <= n) { // 尝试将当前数字i加入组合 temp.push_back(i); // 递归调用,尝试加入下一个数字 recursion(i + 1, n, k); // 移除当前数字i,尝试不加入它的情况 temp.pop_back(); // 如果当前数字i不加入组合,则直接尝试下一个数字 // 注意:这里的递归调用不应该再次尝试加入当前数字i,因为我们已经尝试过 // 所以这里的调用应该与上一个调用使用相同的i值 recursion(i + 1, n, k); } } }; int main() { Solution solution; int n = 4; int k = 2; vector<vector<int>> combinations = solution.combine(n, k); // 打印所有组合 cout << "所有组合:" << endl; for (const auto& combination : combinations) { for (int num : combination) { cout << num << " "; } cout << endl; } return 0; }
标签:temp,组合,int,res,C++,力扣,vector,数组,例题 From: https://www.cnblogs.com/hcrzhi/p/18092304