海智算法训练营第二十五天 | 第七章 回溯算法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语言·开发语言·数据结构·算法
学术头条7 分钟前
清华、智谱团队:探索 RLHF 的 scaling laws
人工智能·深度学习·算法·机器学习·语言模型·计算语言学
Schwertlilien39 分钟前
图像处理-Ch4-频率域处理
算法
IT猿手1 小时前
最新高性能多目标优化算法:多目标麋鹿优化算法(MOEHO)求解TP1-TP10及工程应用---盘式制动器设计,提供完整MATLAB代码
开发语言·深度学习·算法·机器学习·matlab·多目标算法
__lost1 小时前
MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
数学·算法·matlab·微积分·高等数学
thesky1234561 小时前
活着就好20241224
学习·算法
ALISHENGYA1 小时前
全国青少年信息学奥林匹克竞赛(信奥赛)备考实战之分支结构(实战项目二)
数据结构·c++·算法
guogaocai1231 小时前
连续自成核退火热分级(SSA)技术表征共聚聚丙烯(PP)分子链结构
算法
DARLING Zero two♡1 小时前
【优选算法】Pointer-Slice:双指针的算法切片(下)
java·数据结构·c++·算法·leetcode
游是水里的游2 小时前
【算法day19】回溯:分割与子集问题
算法