LeetCode 77 组合(深度优先搜索、回溯算法)
LeetCode 77 组合
缘起,想每天刷一道题,看到这么多题目无从下手,然后随机选取了一道题。第一眼看的时候,感觉还行,做着做着,麻了。然后看了一下别人的解题,恍然大悟,用到了深度优先搜索和回溯算法,其实这两种算法,我之前也见过,但是,只是初步了解。知道深度优先搜索用在搜索二叉树,回溯用在迷宫问题。今天写的这么一道题,也算是收获满满。
先看一下题目:
给定两个整数
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
这是一个递归过程的路径图
为了实现这一个过程,我们采用递归的算法,我们定义了函数dfs
,(dfs为深度优先搜索的意思)
void dfs(int n,int k, int begin, vector<int> &path, vector<vector<int>> &ans){
if (path.size()==k){
//如果path的长度刚好等于k,就将path添加进ans,然后返回
ans.push_back(path);
return;
}
for(int i = begin;i<=n;++i){
path.push_back(i);
dfs(n,k,i+1,path,ans);
//i+1,因为我们为了保证不重复排序,索引我们要将i+1,意味着后序的遍历中访问到的数都为i后面的数
path.pop_back();//为了回到上一步
}
}
这就是这道题的全部代码。
class Solution {
public:
void dfs(int n,int k, int begin, vector<int> &path, vector<vector<int>> &ans){
if (path.size()==k){
ans.push_back(path);
return;
}
for(int i = begin;i<=n;++i){
path.push_back(i);
dfs(n,k,i+1,path,ans);
path.pop_back();
}
}
vector<vector<int>> combine(int n, int k) {
vector<vector<int>> ans;
if(k<=0||n<k){
return ans;
}
vector<int> path;
dfs(n,k,1,path,ans);
return ans;
}
};
本文作者:ChrisNg
本文链接:https://www.cnblogs.com/chrisng/p/15322272.html
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步