海智算法训练营第二十五天 | 第七章 回溯算法part01 | ● 理论基础 ● 77. 组合

学习目标:

1.用递归进行组合(非剪枝)

2.用递归进行组合(剪枝版)

题目:组合

1.用递归进行组合(非剪枝)

做法优点:当需要排列50个数的时候,套循环不可能套这么多,这时候用到递归。

易错点:在回溯的过程中:

dfs(n,k-1,i+1);

我写成了

dfs(n,k--,i++);

这是大错误,我debug了半天才发现,如果用下面这种写法不能达到回溯的效果,因为虽然传入的数字是对的,但是改变了原有k,i的值,导致后续的取值错误。

复制代码
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList();
    public List<List<Integer>> combine(int n, int k) {
        dfs(n,k,1);
        return res;
    }
    
    public void dfs(int n , int k ,int start){
        if(k == 0) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i <= n; i++) {
            path.add(i);
            dfs(n,k-1,i+1);
            path.remove(path.size()-1);
        }
    }
}

2.用递归进行组合(剪枝版)

原理:在1的基础上对i的取值范围进行缩少,对时间空间的占用较少

复制代码
class Solution {
    List<List<Integer>> res = new ArrayList<>();
    List<Integer> path = new ArrayList();
    public List<List<Integer>> combine(int n, int k) {
        dfs(n,k,1);
        return res;
    }
    
    public void dfs(int n , int k ,int start){
        if(k == 0) {
            res.add(new ArrayList<>(path));
            return;
        }
        for (int i = start; i + k -1 <= n; i++) {
            path.add(i);
            dfs(n,k-1,i+1);
            path.remove(path.size()-1);
        }
    }
}

学习时长:2h

总结:此次学习了回溯的相关思想,此前有接触比较好理解,希望后续接触更加的得心应手。

相关推荐
青少儿编程课堂2 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:并查集连通块与朋友圈问题解析
c++·python·算法·bfs·信息学竞赛
Tisfy8 分钟前
LeetCode 2913.子数组不同元素数目的平方和 I:第一题先常数很大的O(n^2)
算法·leetcode·题解·模拟·暴力
罗湖老棍子12 分钟前
[USACO05NOV] Asteroids G(洛谷-P7368)
算法·图论·二分图匹配·最大匹配·最小顶点覆盖
AI技术新视界21 分钟前
Harness^2:递归自进化智能体Harnessing框架
人工智能·深度学习·算法·harness·rsi
这个DBA有点耶30 分钟前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba
爱读书的小胖32 分钟前
Deaf Grandma:C 语言三版代码分析
算法
信奥卷王1 小时前
[GESP202503 六级] 环线(含视频)
算法
CQU_JIAKE1 小时前
10.15【A】
算法
晴天的雨.9921 小时前
【C++】模板进阶
开发语言·c++·算法
木井巳2 小时前
【动态规划】三步问题
java·算法·leetcode·动态规划·推荐算法