Leetcode(437)——路径总和 III

路径总和 III 算法讲解 路径总和 III” 问题通过巧妙运用前缀和与深度优先搜索的方法,可以有效地降低时间复杂度。理解前缀和的思想以及回溯操作在二叉树遍历中的应用,对于解决类似的二叉树路径问题有很大的帮助。在实际编程中,熟练掌握这种方法能够提高我们解决复杂算法问题的能力。希望通过这篇博客,大家对 “路径总和 III” 算法有更深入的理解。 阅读详情

Leetcode(437)——路径总和 III

题目

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。

路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

示例 1:

在这里插入图片描述
输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8
输出:3
解释:和等于 8 的路径有 3 条,如图所示。

示例 2:

输入:root = [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum = 22
输出:3

提示:

  • 二叉树的结点个数的范围是 [0,1000]
  • −109-10^9−109 <= Node.val <= 10910^9109
  • −1000-1000−1000 <= targetSum <= 100010001000

题解

方法一:深度优先搜索,DFS

思路

​​  我们首先想到的解法是穷举所有的可能,我们访问每一个结点 node\textit{node}node,检测以 node\textit{node}node 为起始结点且向下延深的路径有多少种。我们递归遍历每一个结点的所有可能的路径,然后将这些路径数目加起来即为返回结果。

  • 我们首先定义 rootSum(p,val)\textit{rootSum}(p,\textit{val})rootSum(p,val) 表示以结点 ppp 为起点向下且满足路径总和为 valvalval 的路径数目。我们对二叉树上每个结点 ppp 求出 rootSum(p,targetSum)\textit{rootSum}(p,\textit{targetSum})rootSum(p,targetSum),然后对这些路径数目求和即为返回结果。
  • 我们对结点 ppp 求 rootSum(p,targetSum)\textit{rootSum}(p,\textit{targetSum})rootSum(p,targetSum) 时,以当前结点 ppp 为目标路径的起点递归向下进行搜索。假设当前的结点 ppp 的值为 val\textit{val}val,我们对左子树和右子树进行递归搜索,对结点 ppp 的左孩子结点 plp_{l}pl​ 求出 rootSum(pl,targetSum−val)\textit{rootSum}(p_{l}, \textit{targetSum}-\textit{val})rootSum(pl​,targetSum−val),以及对右孩子结点 prp_{r}pr​ 求出 rootSum(pr,targetSum−val)\textit{rootSum}(p_{r},\textit{targetSum}-\textit{val})rootSum(pr​,targetSum−val)。结点 ppp 的 rootSum(p,targetSum)\textit{rootSum}(p,\textit{targetSum})rootSum(p,targetSum) 即等于 rootSum(pl,targetSum−val)\textit{rootSum}(p_{l},\textit{targetSum}-\textit{val})rootSum(pl​,targetSum−val) 与 rootSum(pr,targetSum−val)\textit{rootSum}(p_{r},\textit{targetSum}-\textit{val})rootSum(pr​,targetSum−val) 之和,同时我们还需要判断一下当前结点 ppp 的值是否刚好等于 targetSum\textit{targetSum}targetSum。
  • 我们采用递归遍历二叉树的每个结点 ppp,对结点 ppp 求 rootSum(p,val)\textit{rootSum}(p,\textit{val})rootSum(p,val),然后将每个结点所有求的值进行相加求和返回。
代码实现

我的

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    int psum = 0;	// 二叉树的所有路径中值之和为 targetSum 的路径个数
    long pval = 0;	// 当前路径上的值之和
    long target= 0;	// targetSum
public:
    int pathSum(TreeNode* root, int targetSum){
        if(root == nullptr) return 0;
        target = targetSum;
        valueSum(root);   // 以 root 为起点的值和为 targetSum 的路径个数
        pathSum(root->left, targetSum);
        pathSum(root->right, targetSum);
        return psum;
    }
    void valueSum(TreeNode* root){
        if(root == nullptr) return;
        pval += root->val;
        if(pval == target) psum++;
        valueSum(root->left);
        valueSum(root->right);
        pval -= root->val;
    }
};

Leetcode 官方题解

class Solution {
public:
    int rootSum(TreeNode* root, int targetSum) {
        if (!root) return 0;

        int ret = 0;
        if (root->val == targetSum) ret++;

        ret += rootSum(root->left, targetSum - root->val);
        ret += rootSum(root->right, targetSum - root->val);
        return ret;
    }

    int pathSum(TreeNode* root, int targetSum) {
        if (!root) return 0;
        int ret = rootSum(root, targetSum);
        ret += pathSum(root->left, targetSum);
        ret += pathSum(root->right, targetSum);
        return ret;
    }
};
复杂度分析

时间复杂度:O(N2)O(N^2)O(N2),其中 NNN 为该二叉树结点的个数。对于每一个结点,求以该结点为起点的路径数目时,则需要遍历以该结点为根结点的子树的所有结点,因此求该路径所花费的最大时间为 O(N)O(N)O(N),我们会对每个结点都求一次以该结点为起点的路径数目,因此时间复杂度为 O(N2)O(N^{2})O(N2)。
空间复杂度:O(N)O(N)O(N),考虑到递归需要在栈上开辟空间。

方法二:前缀和 + 递归 + 回溯(路径值的回溯)

思路

​​  我们仔细思考一下,解法一(DFS)中应该存在许多重复计算——重复计算相同路径。此时我们就想起之前的一道题,即数组的前缀和。
​​  定义结点的前缀和为:由根结点到当前结点的路径上所有结点的和。
​​  所以可以用先序遍历二叉树,记录下根结点 root\textit{root}root 到当前结点 ppp 的路径上除当前结点以外所有结点的前缀和,在已保存的路径前缀和中查找是否存在前缀和刚好等于当前结点到根结点的前缀和 currcurrcurr 减去 targetSum\textit{targetSum}targetSum。

  • 对于空路径我们也需要保存预先处理一下,此时因为空路径不经过任何结点,因此它的前缀和为 000。
  • 假设根结点为 root\textit{root}root,我们当前刚好访问结点 node\textit{node}node,则此时从根结点 root\textit{root}root 到结点 node\textit{node}node 的路径(无重复结点)刚好为 root→p1→p2→…→pk→node\textit{root} \rightarrow p_1 \rightarrow p_2 \rightarrow \ldots \rightarrow p_k \rightarrow \textit{node}root→p1​→p2​→…→pk​→node,此时我们可以已经保存了结点 p1,p2,p3,…,pkp_1, p_2, p_3, \ldots, p_kp1​,p2​,p3​,…,pk​ 的前缀和,并且计算出了结点 node\textit{node}node 的前缀和。
  • 假设当前从根结点 root\textit{root}root 到结点 node\textit{node}node 的前缀和为 curr\textit{curr}curr,则此时我们在已保存的前缀和查找是否存在前缀和刚好等于 curr−targetSum\textit{curr} - \textit{targetSum}curr−targetSum。假设从根结点 root\textit{root}root 到结点 node\textit{node}node 的路径中存在结点 pip_ipi​ 到根结点root\textit{root}root 的前缀和为 curr−targetSum\textit{curr} - \textit{targetSum}curr−targetSum,则结点 pi+1p_{i+1}pi+1​ 到 node\textit{node}node 的路径上所有结点的和一定为 targetSum\textit{targetSum}targetSum。
  • 我们利用深度搜索遍历树,当我们退出当前结点时,我们需要及时更新已经保存的前缀和。
代码实现

我写的

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode() : val(0), left(nullptr), right(nullptr) {}
 *     TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
 *     TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
 * };
 */
class Solution {
    int psum = 0;
    long lastval = 0;
    unordered_map<long, int> pathval;    // <前缀和, 个数>
public:
    int pathSum(TreeNode* root, int targetSum){
        if(root == nullptr) return psum;

        long nowval = 0;
        if(pathval.size() == 0){
            nowval = root->val;
            lastval = nowval;
            pathval.emplace(nowval, 1);
        }else{
            nowval = root->val + lastval;
            lastval = nowval;
            if(pathval.count(nowval) != 0) pathval[nowval]++;
            else pathval.emplace(nowval, 1);
        }
        
        pathSum(root->left, targetSum);
        lastval = nowval;
        pathSum(root->right, targetSum);

        if(pathval.size() != 1 || pathval.begin()->second != 1){    // 是不是根结点
            if(nowval == targetSum) psum++;
            if(pathval.count(nowval - targetSum) != 0){
                if(targetSum == 0)// 为了防止 targetSum 为0
                    psum += pathval[nowval] - 1;
                else psum += pathval[nowval - targetSum];
            }
            if(pathval[nowval] != 1) --pathval[nowval];
            else pathval.erase(nowval);
        }else if(pathval.count(targetSum) != 0) psum++;
        return psum;
    }
};

Leetcode 官方题解

class Solution {
public:
    unordered_map<long long, int> prefix;

    int dfs(TreeNode *root, long long curr, int targetSum) {
        if (!root) {
            return 0;
        }

        int ret = 0;
        curr += root->val;
        if (prefix.count(curr - targetSum)) {
            ret = prefix[curr - targetSum];
        }

        prefix[curr]++;
        ret += dfs(root->left, curr, targetSum);
        ret += dfs(root->right, curr, targetSum);
        prefix[curr]--;

        return ret;
    }

    int pathSum(TreeNode* root, int targetSum) {
        prefix[0] = 1;
        return dfs(root, 0, targetSum);
    }
};

网友简洁写法:
每个结点的过程是 : 求当前结点结束的路径数量,将以当前结点为结尾的前缀和入表,递归当前结点的左右子树,回溯(本结点前缀和出表)

class Solution {
public:
    unordered_map<int64_t, int> m{{0,1}};
    int pathSum(TreeNode* root, int targetSum, int64_t sum = 0) {
        if(!root) return 0;
        int v = (m.count(sum + root->val - targetSum) ? m[sum + root->val - targetSum] : 0);
        ++m[sum + root->val];
        int ret = pathSum(root->left, targetSum, sum + root->val) + pathSum(root->right, targetSum, sum + root->val);
        if(--m[sum + root->val] == 0) m.erase(sum + root->val);
        return v + ret;
    }
};
复杂度分析

时间复杂度:O(N)O(N)O(N),其中 NNN 为二叉树中节点的个数。利用前缀和只需遍历一次二叉树即可。
空间复杂度:O(N)O(N)O(N),主要是递归所使用的空间和哈希表。

【LeetCode 热题100】 437. 路径总和 III 的算法思路及python代码 给定一个二叉树的根节点root,和一个整数targetSum,求该二叉树里节点值之和等于targetSum的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 阅读详情

相关推荐

卫星测试科普(三):卫星载荷的核心测试设备探秘

总的说来,卫星芯片与元器件,部组件与单机,整机与子系统,系统与整星的设计、定型、制造、验证、总装、发射、在轨等环节都离不开各种测试场景,对于这些卫星测试场景而言,“射频三大件”与高速数字示波器是构成强大测试系统的基础。卫星通信信号生成:覆盖Ka、Q等波段,具备扫频、脉冲、数字调制、噪声信号、雷达信号、数据链信号、OFDM 等多种信号库,用于测试和验证卫星电子设备的电气性能、频率响应、抗干扰能力等。卫星的通信需要高效、快速地传输大量数据,高速信号的质量至关重要,如果卫星信号不佳,卫星就会出现故障或者隐患。

spwbjss的博客 2317

437. 路径总和 III ●●

437. 路径总和 III ●●、二叉树、深度优先搜索、前缀和

chenyfan_blog 600

uniapp 记录运动轨迹 开发_智能手环穿戴设备APP开发解决方案

智能手环是一种穿戴式智能设备,是目前备受关注的科技产品。目前智能手环具有的功能有记录日常生活中的运动数据、移动轨迹,定位等,有些还可以进行睡眠质量的检测,并将这些数据传送至移动端如手机、平板等,可对数据进行分析,指导健康生活的作用。而智能手环开发方案就是将这些功能实现,将算法烧录到主控板上。智能手环都有哪些功能  1、记录运动数据  对于喜欢健身的用户来说,智能手环记录的运动数据功能...

weixin_39678493的博客 1764

【LeetCode】 hot100— 437. 路径总和 III_前缀和

给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的。输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8。不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。解释:和等于 8 的路径有 3 条,如图所示。

weixin_44382896的博客 1340

PINN内嵌物理知识神经网络入门及文献总结

内嵌物理知识深度学习方法(PINN)已经成功用于解决各类科学计算问题,其本质是将物理先验知识嵌入神经网络训练中,将一个求解PDE的问题转化为一个优化问题。这篇博客主要记录PINN相关论文

山里娃的博客 7万+

C# 操作Excel的时候,出现"被呼叫方拒绝接受呼叫的异常"的解决方案(参考官方给出的解决方案)

首先官方有对这个错误给出解释和解决方案,连接如下: https://docs.microsoft.com/zh-cn/previous-versions/ms228772(v=vs.120)#%E5%8F%AF%E9%9D%A0%E7%BC%96%E7%A8%8B 简单来说,貌似是线程问题,我猜。。。 之前我尝试着在代码中添加 Thread.Sleep(1000); 来进行解决,这种办...

Ck_Max的博客 5767

【Hot100】LeetCode—437. 路径总和 III

【代码】【Hot100】LeetCode—437. 路径总和 III。

weixin_44382896的博客 667

【Bluetooth|蓝牙开发】二、蓝牙开发入门

蓝牙,是一种利用低功率无线电,支持设备短距离通信的无线电技术,能在包括移动电话、PDA、无线耳机、笔记本电脑、相关外设等众多设备之间进行无线信息交换,蓝牙工作在全球通用的2.4GHz ISM(即工业、科学、医学)频段,使用IEEE802.11协议。

Donge's Blog 1万+

LeetCode - 437 - 路径总和III(path-sum-iii)

Create by jsliang on 2019-07-29 11:25:062019-07-29 11:25:09一 目录不折腾的前端,和咸鱼有什么区别| 目录 | ...

weixin_41806099的博客 406

mapbox进阶,百度地图、高德地图纠偏,使用在线网络地图加载插件

本文详细介绍如何基于mapbox-gl v3.8.0版本百度地图、高德地图纠偏,使用在线网络地图加载插件,亲测可用。希望能帮助到您。一起学习,加油!加油!

我哎GIS博客 748

华为OD机试真题 2026-9-2【查找幸运数】

华为OD机试真题 新系统【查找幸运数】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题 【查找幸运数】多语言题解。

qq_45776114的博客 497

leetcode437-路径总和III

leetcode437-路径总和III

weixin_45799371的博客 1232

CXSMILES细则-用于在 SMILES 字符串后存储分子的特殊特征

Chemaxon 扩展 SMILES/SMARTS 用于在 SMILES 字符串后存储分子的特殊特征。任何信息都可以存储在 SMILES 字符串后,只要它们由空格或制表符字符分隔,因为 SMILES 解析器会忽略这些信息,或者将它们作为注释使用。扩展特征以以下格式存储:Chemaxon 的扩展 SMILES/SMARTS 不包含非 ASCII 字符,它们通常以字符代码 n 的形式被转义为 &#n;。在 S-group 中,ASCII 字符“,”、“;”、“|”、“{”、“}”也以这种方式转义。此外,符号“$

ASKCOS博客 401

golang力扣leetcode 437.路径总和III

437.路径总和III437.路径总和III题解代码 437.路径总和III 437.路径总和III 题解 题目:给一个二叉树,和一个target,求从上到下的路径,有几条路径的路径和=target,路径可以不包含根节点,叶子节点,但是路径要从上到下,连续。 思路: 双重递归 题目意思就是说可以不包括父节点 1.那么就有两种情况,包括和不包括 2.dfs:计算包含当前节点,并递归左右子树 3.pathSum:包含父节点进入dfs,不包含父节点进入左右子树的pathSum 前缀和 1.我们知道遍历树

清风 557

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

【每日算法】LeetCode 437. 路径总和 III

路径总和 III 问题解析与实现 本文介绍了LeetCode 437题"路径总和 III"的三种解决方案。该问题要求在二叉树中找出所有节点值之和等于目标值的路径,路径可以从任意节点开始向下延伸。 暴力递归法采用双重递归,时间复杂度O(n²),思路简单但效率较低。前缀和优化法是效率最高的解决方案(O(n)),利用哈希表存储前缀和,类似数组的两数之和问题。BFS+DFS组合法结合两种遍历方式,时间复杂度O(n²)。 在前端开发中,类似思想可应用于DOM树遍历、组件状态管理和路由权限验证等场景

LYFlied的博客 721

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

LeetCode 437. 路径总和 III

LeetCode 437. 路径总和 III

梦~' 1186

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

力扣437. 路径总和 III

力扣437. 路径总和 III

LNsupermali的博客 956

力扣437.路径总和 III

【代码】力扣437.路径总和 III。

Pisasama的博客 319

LeetCode 437:路径总和 III

路径总和 III 题目描述: 给定一个二叉树的根节点 root,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点) 示例 1: 输入:root = [10,5,-3,3,2,null,11,3,-2,null,1], targetSum = 8 输出:3 解释:和等于 8 的路径有 3 条,如图所示。 示例 .....

zxl1990_ok的博客 1235

LeetCode 437 - 路径总和 III

这一题是 LeetCode 中关于二叉树路径求和的经典题目。最容易踩坑的点在于:路径不要求从根开始,也不要求在叶子结束,只要方向是从父到子即可。这看上去简单,但直接暴力 DFS 会让你感觉“这树怎么走都走不完”,而且容易写出 O(n²) 的代码。

记录从移动端、鸿蒙到物联网与AI的完整实战与思考。专注于分享可复用的工程方案与产品思维,尤其深入鸿蒙生态与全栈开发。以十年工程与管理沉淀,为你提供清晰的技术纵深路径。坚信技术的价值在于“贯通”与“落地”。 888

leetcode 437. 路径总和 III

437. 路径总和 III 给定一个二叉树,它的每个结点都存放着一个整数值。 找出路径和等于给定数值的路径总数。 路径不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。 二叉树不超过1000个节点,且节点数值范围是 [-1000000,1000000] 的整数。 示例: root = [10,5,-3,3,2,null,11,3,-2,null,1], sum = 8 10 / \ 5 -3 / \ \ 3

Qin_酱的博客 292

【leetcode-python-35】437. 路径总和 III

【leetcode-python-35】437. 路径总和 III参考大佬版1(49.94%)参考大佬版2(82.23%) leetcode 437. 路径总和 III 参考大佬版1(49.94%) 双层递归。 pathSum记录路径数=以根节点开始的路径数+以左右子树为整体的路径数(不一定以左右子树的根节点开始)。 dfs记录以根节点开始的路径数,只要找到一条就+1,找不到就递归地-root.val往下继续找。 这样每一条都找过且都得算,可能有重复的,太慢了。那就递归+散列表,会更高效,具体代码请参考题解

huajiao4的博客 248

【LeetCode: 437. 路径总和 III + 二叉树 + 递归】

【LeetCode: 437. 路径总和 III + 二叉树 + 递归】给定一个二叉树的根节点 root ,和一个整数 targetSum ,求该二叉树里节点值之和等于 targetSum 的 路径 的数目。路径 不需要从根节点开始,也不需要在叶子节点结束,但是路径方向必须是向下的(只能从父节点到子节点)。

Coder_ljw的博客 1722

LeetCode Hot100【二叉数-437. 路径总和 III】

【代码】LeetCode Hot100【二叉数-437. 路径总和 III】

qq_45940888的博客 567

【LeetCode】Leetcode437. 路径总和 III

本文讨论了LeetCode题目"路径总和 III"的两种解法。初始思路采用双重DFS遍历,时间复杂度较高;改进思路引入前缀和技巧,将问题转化为类似"和为K的子数组"问题,利用哈希表存储前缀和优化计算。后者通过单次DFS遍历统计满足条件的路径数,时间复杂度优化至O(n)。两种方法均采用递归实现,但改进方案通过前缀和与哈希表显著提升了效率。

weixin_49119476的博客 763
上一篇: Leetcode(543)——二叉平衡树
下一篇: Leetcode(101)——对称二叉树
486L
博客等级 码龄7年 20粉丝 117原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值