首页 > 其他分享 >路径总和

路径总和

时间:2023-08-16 09:34:08浏览次数:27  
标签:right return int 路径 nullptr targetSum root 总和

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台

经验1:

如果一段程序写在递归的上方,代表这一层函数压栈时(也就是这层递归开始运行时)运行这段程序

int fun(int n) {
    static int i = 0;
    if (n == 1) return 1;
    if (n == 4) return i;
    i++;
    fun(n - 1);
    return i;
}
int main() {
    cout << fun(5) << endl;
}

运行结果为1

如果一段程序写在递归的下方,代表上一层函数函数弹栈时(也就是上一层递归运行结束后)运行这段程序

int fun(int n) {
    static int i = 0;
    if (n == 1) return 1;
    i++;
    fun(n - 1);
    if (n == 4) return i;
    return i;
}
int main() {
    cout << fun(5) << endl;
}

运行结果为4

经验2:什么叫回溯,以及回溯的作用

  • 回溯就是左子树运行的时候会改变某个变量的值,比如此题的targetSum(一定注意传递targetSum要用引用传递,保证传到递归函数中的还是函数最开始传进来的那个targetSum),左子树运行完之后要加一行代码(这行代码就是回溯),将该变量的值改为左子树运行之前的值。回溯的作用就是让左右子树操作同一个变量是互相不影响。
 1 bool hasPathSum(TreeNode* root, int& targetSum) {
 2     if (root == nullptr) return false;
 3     targetSum -= root->val;
 4     if (root->left == nullptr && root->right == nullptr && targetSum == 0) return true;
 5     if (root->left == nullptr && root->right == nullptr && targetSum != 0) return false;
 6     if (root->left) {
 7         bool leftresult = hasPathSum(root->left, targetSum);
 8         targetSum+=root->left->val;
 9         if (leftresult) return true;
10     }
11     if (root->right) {
12         bool rightresult = hasPathSum(root->right, targetSum);
13         targetSum+=root->right->val;
14         if (rightresult) return true;
15     }
16     return false;
17 }
  • 可以不用回溯吗,可以!我们可以将递归函数进行值传递,这样运行到左子树的递归时实参经过左子树的这一层函数不会发生改变,等传给右子树的递归还会保持左子树的递归之前的那个值。
 1 bool hasPathSum(TreeNode* root, int targetSum) {
 2     if (root == nullptr) return false;
 3     targetSum -= root->val;
 4     if (root->left == nullptr && root->right == nullptr && targetSum == 0) return true;
 5     if (root->left == nullptr && root->right == nullptr && targetSum != 0) return false;
 6 
 7     if (root->left) {
 8         bool leftresult = hasPathSum(root->left, targetSum);
 9 
10         if (leftresult) return true;
11     }
12     if (root->right) {
13         bool rightresult = hasPathSum(root->right, targetSum);
14 
15         if (rightresult) return true;
16     }
17     return false;
18 }

也就是说值传递=引用传递+回溯,但是引用传递+回溯是更好的选择,因为我每递归一次就得开辟一个新的targetSum,随着递归层数的增加,我们就会出现栈溢出

标签:right,return,int,路径,nullptr,targetSum,root,总和
From: https://www.cnblogs.com/Sandals-little/p/17633064.html

相关文章

  • Url重写隐藏网页路径技术
        Url重写:实质上是将网页真实的Url隐藏起来,使用户通过虚拟的Url来访问资源,以弥补真是Url的许多不足;作用:(1)满足搜索引擎的需要,实现搜索引擎排名的优化(2)隐藏网页实现技术,增强网站安全性(3)提高网站的安全性和实用性(4)Url支持"可删减"的需求下面通过代码来了解Url重写......
  • 好用的路径匹配
    importorg.springframework.util.AntPathMatcher;publicstaticvoidmain(String[]args){AntPathMatchermatcher=newAntPathMatcher();System.out.println(matcher.match("/user/**","/user"));System.out.pri......
  • 【剑指Offer】 24、二叉树中和为某一值的路径
    【剑指Offer】24、二叉树中和为某一值的路径题目描述:输入一颗二叉树的根结点和一个整数,打印出二叉树中结点值的和为输入整数的所有路径。路径定义为从树的根结点开始往下一直到叶结点所经过的结点形成一条路径。(注意:在返回值的list中,数组长度大的数组靠前)解题思路:本题实......
  • [YsOI2023] 广度优先遍历 逆向输出路径(分层建树拓扑序. LCA)
    今天的模板测试是无向图上的广度优先遍历,【数据删除】马上写好了代码:1#include<cstdio>2#include<cstring>3#include<iostream>4#include<algorithm>5#include<vector>6#include<queue>7usingnamespacestd;8constintmaxn=100005;......
  • 路径规划算法:基于人工蜂鸟优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 路径规划算法:基于协作搜索优化的机器人路径规划算法- 附matlab代码
    ✅作者简介:热爱科研的Matlab仿真开发者,修心和技术同步精进,matlab项目合作可私信。......
  • 剑指 Offer 12. 矩阵中的路径
    力扣官方解法:classSolution{public:boolexist(vector<vector<char>>&board,stringword){inth=board.size(),w=board[0].size();vector<vector<int>>visited(h,vector<int>(w));for(inti=0......
  • 怎么给路径起别名, 并且开启代码提示
    效果:将src文件夹用@符号代替,并且在输入的时候还有提示实现:vue-cli创建的项目,在jsconfig.json文件里面{"compilerOptions":{"baseUrl":"./","paths":{"@/*":["src/*"]},}}......
  • 改大蟒蛇Anaconda中Jupyter Notebook默认工作路径
    先用大蟒蛇的终端生成配置文件输入jupyternotebook--generate-config然后会告诉你生成文件的地址。文本模式打开该文件搜索“Thedirectorytousefornotebooks”,把下面的取消注释,写好文件目录重启即可......
  • Python文件路径解谜:深入剖析os.path系列函数的精髓
    介绍在Python中,os.path模块提供了一系列用于处理文件路径和文件系统的函数。它是Python标准库中os模块的一部分。本文将深入探讨os.path系列函数的使用方法,从入门到精通。目录导入os.path模块获取文件路径信息os.path.abspath():获取绝对路径os.path.dirname():获取目录......