题目
给定两个整数 n 和 k,返回范围 [1, n] 中所有可能的 k 个数的组合。
你可以按 任何顺序 返回答案。
示例 1:
输入:n = 4, k = 2
输出:
[
[2,4],
[3,4],
[2,3],
[1,2],
[1,3],
[1,4],
]
示例 2:
输入:n = 1, k = 1
输出:[[1]]
提示:
1 <= n <= 20
1 <= k <= n
思路
我先是想的思路为组合数字的思路,给你123456,然后让你输出他们的组合,但是这样子做会有重复,因为他们这样是无序的,比如123456和213456算两个,但是本题目是不算的。所以我打算给他去重一下,但是后面发现了一个更简单的思路。
我们只要从第一个数开始一直往后遍历就好了,如12345,我们只需要从1,开始遍历,然后依次判断下一个数是否要放入数组中,此时有两种情况,放或不放,我们都走一遍就可以。这样子从前往后的遍历就不会产生还要去重的问题了。
并且最后我们还做了剪枝。
代码
class Solution {
public:
vector<int> temp;
vector<vector<int>> ans;
void dfs(int curr, int n, int k)
{
if(temp.size() + n - curr + 1< k) return ;//剪枝,长度不够再遍历下去也凑不到k长
if(temp.size() == k)
{
ans.push_back(temp);//插入合理的数据
return;
}
//选取当前的数
temp.push_back(curr);
dfs(curr + 1, n, k);
//不选取当前的数
temp.pop_back();//先弹出插入的数
dfs(curr + 1, n, k);
}
vector<vector<int>> combine(int n, int k) {
dfs(1, n, k);
return ans;
}
};