时隔大半个月开始来补打卡训练营了呜呜┭┮﹏┭┮
https://leetcode.cn/problems/combinations/
77.组合
我觉得这道题的回溯法很符合暴力遍历的思想。
看这张图会方便理解,首先就是最开始的元素各取一个出来,然后取完一个元素的组合又继续在剩下的元素中取,不断循环,直到组合的大小为k。代码其实还挺简单,相信看完结合图就会明白。
class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracing(int n,int k,int indexstart)
{
if(path.size()==k)
{
result.push_back(path);
return;
}
for(int i=indexstart;i<=n;i++)
{
path.push_back(i);
backtracing(n,k,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n,int k)
{
result.clear();
path.clear();
backtracing(n,k,1);
return result;
}
};
剪枝
之前已经做过一次这道题,所以再听卡哥讲的时候觉得好接受了很多,剪枝其实就是限制范围,只要是剩下的不足以拼凑成组合的那就不必考虑了。
class Solution {
private:
vector<vector<int>>result;
vector<int>path;
void backtracing(int n,int k,int indexstart)
{
if(path.size()==k)
{
result.push_back(path);
return;
}
for(int i=indexstart;i<=(n-(k-path.size())+1);i++)
{
path.push_back(i);
backtracing(n,k,i+1);
path.pop_back();
}
}
public:
vector<vector<int>> combine(int n,int k)
{
result.clear();
path.clear();
backtracing(n,k,1);
return result;
}
};