题目
给定两个整数 n 和 k,返回 1 … n 中所有可能的 k 个数的组合。
示例1
输入:
n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
解法
- 一个个放入元素
- 回溯跳出的条件: 解中的元素个数等于k
- 回溯放入的数字:后面的比前面的大,用now_num存储,从now_num开始遍历
- 可以剪枝,当现有的个数 + 后面可能放入的个数 < k 不可能是解,直接返回。
代码
#include <stdio.h>
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
vector<vector<int>> ans;
vector<int> tmp;
vector<vector<int>> combine(int n, int k) {
dfs(n,k,1);
return ans;
}
void dfs(int n,int k,int now_num){
/*
n = 7 k = 5 tmp = [1,2] now_num = 6
tmp.size() + (n-now_num+1) < k 达不到条件直接返回
2 + (7-6+1) < 5
1 2 3 4 5 6 7
*/
if(tmp.size()+n-now_num+1 < k){
return;
}
if(tmp.size() == k){
ans.push_back(tmp);
return;
}
for(int i=now_num;i<=n;i++){
tmp.push_back(i);
dfs(n,k,i+1);
tmp.pop_back();
}
}
};
int main()
{
int n = 4,k = 2;
Solution s;
vector<vector<int>> ans = s.combine(n, k);
for(int i=0;i<ans.size();i++){
for(int j=0;j<ans[i].size();j++){
if(j!=0) cout<<",";
cout<<ans[i][j];
}
cout<<endl;
}
}
今天也是爱zz的一天哦!