海智算法训练营第二十五天 | 第七章 回溯算法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

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

相关推荐
AI科技星9 分钟前
统一场论中电场的几何起源:基于立体角变化率的第一性原理推导与验证
服务器·人工智能·线性代数·算法·矩阵·生活
Keep_Trying_Go1 小时前
基于无监督backbone无需训练的类别无关目标统计CountingDINO算法详解
人工智能·python·算法·多模态·目标统计
有时间要学习1 小时前
面试150——第三周
算法·面试
一车小面包2 小时前
Neo4j中的APOC
算法·neo4j
H_BB2 小时前
前缀和算法详解
数据结构·算法
聆风吟º2 小时前
【数据结构手札】时间复杂度详解:概念 | 大O渐进表示法 | 习题
数据结构·算法·时间复杂度·大o渐进表示法
山楂树の3 小时前
买卖股票的最佳时机(动态规划)
算法·动态规划
小O的算法实验室3 小时前
2024年IEEE TMC SCI1区TOP,面向无人机辅助 MEC 系统的轨迹规划与任务卸载的双蚁群算法,深度解析+性能实测
算法·无人机·论文复现·智能算法·智能算法改进
无才顽石4 小时前
什么是数学
算法·数理象
CoderCodingNo4 小时前
【GESP】C++五级真题(数论, 贪心思想考点) luogu-B4070 [GESP202412 五级] 奇妙数字
开发语言·c++·算法