首页 > 编程语言 >【唐叔学算法】第二天:探索递归的魅力

【唐叔学算法】第二天:探索递归的魅力

时间:2024-12-05 23:32:16浏览次数:11  
标签:递归 唐叔学 题号 算法 candidates result LeetCode

递归算法简介

递归算法是一种在解决问题时,将问题分解成更小的、相似的子问题来解决的方法。它是一种非常强大的编程技术,尤其适用于那些可以自然分解为相似子问题的场景。递归算法的核心思想是:问题可以分解为更小的相同问题,直到问题足够小以至于可以直接解决

如何使用递归算法

使用递归算法时,你需要定义两个关键部分:

  1. 基本情况(Base Case):这是递归停止的条件,防止无限递归。
  2. 递归步骤(Recursive Step):这是递归调用自己的过程,每次调用都应该向基本情况靠近。

递归算法的使用场景

递归算法适用于以下场景:

  • 树结构和图结构:如二叉树遍历、图的深度优先搜索(DFS)。
  • 分治算法:如归并排序、快速排序。
  • 动态规划问题:某些动态规划问题可以通过递归+记忆化的方式来优化。
  • 数学问题:如计算阶乘、斐波那契数列等。

LeetCode递归题目解析

入门难度:二叉树的前序遍历(题号:144)

题目链接LeetCode 144. Binary Tree Preorder Traversal

解题思路:前序遍历的顺序是:根节点 -> 左子树 -> 右子树。我们可以递归地遍历左子树和右子树。

Java代码示例

class Solution {
    public List<Integer> preorderTraversal(TreeNode root) {
        List<Integer> result = new ArrayList<>();
        if (root == null) return result;
        result.add(root.val);
        result.addAll(preorderTraversal(root.left));
        result.addAll(preorderTraversal(root.right));
        return result;
    }
}

中等难度:组合总和(题号:39)

题目链接LeetCode 39. Combination Sum

解题思路:我们需要找出所有可能的组合,使得它们的和等于目标值。对于每个数字,我们可以选择包含它或不包含它,然后递归地处理剩余的数字。

Java代码示例

class Solution {
    public List<List<Integer>> combinationSum(int[] candidates, int target) {
        List<List<Integer>> result = new ArrayList<>();
        backtrack(candidates, target, 0, new ArrayList<>(), result);
        return result;
    }

    private void backtrack(int[] candidates, int target, int start, List<Integer> current, List<List<Integer>> result) {
        if (target == 0) {
            result.add(new ArrayList<>(current));
            return;
        }
        for (int i = start; i < candidates.length; i++) {
            if (candidates[i] > target) break;
            current.add(candidates[i]);
            backtrack(candidates, target - candidates[i], i, current, result);
            current.remove(current.size() - 1);
        }
    }
}

更多递归题目

以下是一些可以使用递归算法解答的LeetCode题目:

递归算法是一种强大且优雅的解决问题的方法,希望这篇文章能帮助你更好地理解和应用递归。记得在实际编程中,递归可能会导致栈溢出,所以合理使用递归,并考虑使用迭代或尾递归优化。

标签:递归,唐叔学,题号,算法,candidates,result,LeetCode
From: https://blog.csdn.net/Tang_is_learning/article/details/144278347

相关文章

  • 每日一道算法题之被围绕的区域-洪水填充
    classSolution{publicvoidsolve(char[][]board){//思路:从边缘入手,遇到O.就渲染为'F',递归渲染其他O;//再遍历.遇到的O就可以都渲染为X.//最后更新F为O;intm=board.length;intn=board[0].length;for......
  • 还在为数据缺失烦恼?9种缺失值插值算法打包带走
    目录基本介绍程序设计参考资料获取方式基本介绍还在为数据缺失烦恼?9种缺失值插值算法打包带走9种缺失值插值算法Matlab代码含三次样条插值、线性插值、Hermite插值等使用该程序可以:(1)实现缺失数据插值;(2)对定义域外的样本点进行插值;(3)区分内插和外插,均可以选择不同的......
  • window.crypto.subtle 实现AES-128对称加密算法
    window.crypto.subtle支持AES-128对称加密算法。AES(高级加密标准)是一种广泛使用的对称加密算法,它有三种密钥长度:128位、192位和256位。在WebCryptoAPI中,你可以选择不同的密钥长度来生成AES密钥。以下是一个使用AES-128-CBC模式的加密和解密示例:asyncfunctiongenerateKey()......
  • 贪心算法 part03
    文章参考来源代码随想录134.加油站方法一分类讨论:情况一:如果gas的总和小于cost总和,那么无论从哪里出发,一定是跑不了一圈的情况二:rest[i]=gas[i]-cost[i]为一天剩下的油,i从0开始计算累加到最后一站,如果累加没有出现负数,说明从0出发,油就没有断过,那么0就是起点。情况三:如......
  • Baum-Welch 算法
    Baum-Welch算法假设给定训练数据只包含SSS个长度为TTT的观测......
  • C++算法练习-day62——491.非递减子序列
    题目来源:.-力扣(LeetCode)题目思路分析这个问题要求找出数组 nums 中的所有非严格递增子序列,其中每个子序列至少包含两个元素。非严格递增子序列意味着子序列中的元素可以相等,但不允许递减。为了解决这个问题,可以使用回溯法。回溯法是一种通过探索所有可能的候选解来找出......
  • C++算法练习-day61——90.子集2
    题目来源:.-力扣(LeetCode)题目思路分析题目要求找出给定数组的所有子集(幂集),但数组可能包含重复元素,要求结果中的子集是唯一的(不包含重复的子集)。为了解决这个问题,我们可以先对数组进行排序,然后在回溯过程中跳过重复的元素,以确保生成的每个子集都是唯一的。代码:#include<v......
  • C++算法练习-day60——78.子集问题
    题目来源:.-力扣(LeetCode)题目思路分析题目要求找出给定数组的所有子集(幂集)。子集是指原数组中任意元素组合形成的数组,包括空集和原数组本身。这个问题可以通过回溯算法(Backtracking)来解决。回溯算法是一种通过探索所有可能的候选解来找出所有解的算法。对于子集问题,我们可以......
  • 关于二叉树的先/中/后序的非递归遍历
    力扣上有原题~中 先后前言先前跟着acwing学习算法基础课,自以为已经掌握了基础的算法和数据结构,剩下就差做题了,结果之后在力扣和洛谷上看到有关二叉树的题目,完全不知道是怎么一回事,故开始二叉树的学习(果然学习数据结构基础不能光看课)正文本片文章主要讲述二叉树的先中后......
  • 算法之旅:二叉树的删除、验证与插入(98,700,701,450)
    ......