个人主页:元清加油_【C++】,【C语言】,【数据结构与算法】-CSDN博客
个人专栏
力扣递归算法题
http://t.csdnimg.cn/yUl2I
【C++】
http://t.csdnimg.cn/6AbpV
数据结构与算法
http://t.csdnimg.cn/hKh2l
前言:这个专栏主要讲述递归递归、搜索与回溯算法,所以下面题目主要也是这些算法做的
我讲述题目会把讲解部分分为3个部分:
1、题目解析
2、算法原理思路讲解
3、代码实现
题目链接:
题目
给定两个整数 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
给定两个整数 n
和 k
,返回范围 [1, n]
中所有可能的 k
个数的组合。
你可以按 任何顺序 返回答案
示例 1:
输入:n = 4, k = 2 输出: [ [2,4], [3,4], [2,3], [1,2], [1,3], [1,4], ]
一、画出决策树
以 n = 4,k = 2 为例子
既然是树形问题上的 深度优先遍历,因此首先画出树形结构。例如输入:n = 4, k = 2,我们可以发现如下递归结构:
依次类推(后面部分省略),以上描述体现的 递归 结构是:在以 nnn 结尾的候选数组里,选出若干个元素。画出递归结构如下图:
决策树就是我们后面设计函数的思路
二、设计代码
(1)全局变量
vector> ret;
vector path;
int N, K;
(2)设计递归函数
void dfs(int pos);
递归流程如下:
以上思路讲解完毕,大家可以自己做一下了
class Solution {
public:
vector> ret;
vector path;
int N, K;
void dfs(int pos)
{
if (path.size() == K)
{
ret.push_back(path);
return ;
}
for (int i = pos; i <= N; i++)
{
path.push_back(i);
dfs(i+1);
path.pop_back();
}
}
vector> combine(int n, int k)
{
N = n;
K = k;
dfs(1);
return ret;
}
};