组合数
问题描述
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
感悟
作为菜鸡的自己,这题一直是自己的心头之恨,上次和好友打比赛,遇到这题直接卡顿,
想法是直接暴力,k为2直接两个for循环,但是k很大,直接暴力就体现出它的局限性质了
解析
class Solution {
public:
//创建全局变量,方便
vector<vector<int>> result;
vector<int> path;
void backtracking(int n, int k, int 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();
}
}
vector<vector<int>> combine(int n, int k) {
backtracking(n, k, 1);
return result;
}
};
其中startIndex是判断当前下标为多少开始,说实话,有点dfs的感觉,
比如最开始startIndex = 1 然后是存储就是1 然后递归到下一层startIndex就是2,当然这里的K = 2
解析为什么后面要有path.pop_back()
- 当k = 2 的时候, 先装1 ,然后下一层的startIndex = i + 1 也就是2开始
- 将2 存入到path容器中,这是有递归startIndex 应该为3,进入到下一层的backtracking 发现 k == path.size();回退到上一层
- 然后就应该现在容器path 是
{1, 2}
一个pop_back 变成{1} 但是还在for循环中 - 现在i的下标是2 ,然后就i++ 就是3了
end...
标签:组合,int,startIndex,back,算法,result,回溯,path,backtracking From: https://www.cnblogs.com/tsqo/p/17177581.html