海智算法训练营第二十五天 | 第七章 回溯算法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 分钟前
Horizon J6m 部署 YOLOv8s INT8 精度下降问题排查记录
算法
橘子汽水1685 分钟前
Leetcode 200,994岛屿数量,腐烂的橘子
数据结构·算法·leetcode
hansang_IR2 小时前
【题解】P5364 [SNOI2017] 礼物
c++·线性代数·算法
Tisfy2 小时前
LeetCode 3871.统计范围内的逗号 II:每次算一个逗号
数学·算法·leetcode·题解
小O的算法实验室2 小时前
IEEE TEVC,基于K-means与DQN辅助元启发式算法的多目标两栖无人艇调度模型
算法·kmeans·启发式算法
mmmmath_32 小时前
LeetCode.350.两个数组的交集II
算法
Ivanqhz2 小时前
图是“拓扑 + 类型 + 形状“的世界
算法·决策树·机器学习·php·集成学习
find1star2 小时前
LeetCode 54:螺旋矩阵——用四个边界模拟矩阵收缩
java·算法·leetcode·边缘计算·学习方法
z_mazin3 小时前
逆向一种私有二进制序列化格式:从零到字节级解析器
网络·python·网络协议·算法·rpc
luj_17683 小时前
罚球线右移破防新策略
c语言·开发语言·网络·经验分享·算法