77. Combinations
77. Combinations
题目描述
回溯法
版本一
class Solution {vector<vector<int>> res;vector<int> com;
public:vector<vector<int>> combine(int n, int k) {for(int i = 1;i <=n;i++){com.push_back(i);backtracing(i+1,n,k);com.pop_back();}return res;}void backtracing(int start,int end,int k){if(com.size() == k){res.push_back(com);return;}for(int i = start;i <= end;i++){com.push_back(i);backtracing(i+1,end,k);com.pop_back();}}
};
版本二,最开始的循环是不必要的。
class Solution {vector<vector<int>> res;vector<int> com;
public:vector<vector<int>> combine(int n, int k) {backtracing(1,n,k);return res;}void backtracing(int start,int end,int k){if(com.size() == k){res.push_back(com);return;}for(int i = start;i <= end;i++){com.push_back(i);backtracing(i+1,end,k);com.pop_back();}}
};
剪枝优化一:
class Solution {vector<vector<int>> res;vector<int> com;
public:vector<vector<int>> combine(int n, int k) {backtracing(1,n,k);return res;}void backtracing(int start,int end,int k){if(com.size() == k){res.push_back(com);return;}for(int i = start;i <= end;i++){if(end - i + 1 + com.size() < k)continue;com.push_back(i);backtracing(i+1,end,k);com.pop_back();}}
};
剪枝优化二:
class Solution {vector<vector<int>> res;vector<int> com;
public:vector<vector<int>> combine(int n, int k) {backtracing(1,n,k);return res;}void backtracing(int start,int end,int k){if(com.size() == k){res.push_back(com);return;}for(int i = start;i <= (end - (k-com.size()) + 1);i++){com.push_back(i);backtracing(i+1,end,k);com.pop_back();}}
};