LeetCode刷题——190403

本文解析了LeetCode上的三道经典题目:杨辉三角Ⅱ、二叉树最大路径和及最长同值路径,提供了清晰的解题思路及Java代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LeetCode119杨辉三角Ⅱ

题目:

给定一个非负索引 k,其中 k ≤ 33,返回杨辉三角的第 k 行。

思路:

构建一个一维数组:从第一层开始往下计算,每层从最后一个数开始计算

代码:

    public  ArrayList<Integer> getRow(int rowIndex) {
       ArrayList<Integer> res = new ArrayList<Integer>();    
       for(int i=0;i<=rowIndex;++i){ //从i=0开始,因为i<2时,不满足j>0
       //所以i=0,i=1不执行下列for循环
          for(int j=i-1;j>0;--j) 
             res.set(j, res.get(j)+res.get(j-1));//dp[i][j]=dp[i-1][j-1]+dp[i][j];
          res.add(1);
       }
       return res;
    }




LeetCode124 二叉树最大路径和

题目:

给定一个非空二叉树,返回其最大路径和。

本题中,路径被定义为一条从树中任意节点出发,达到任意节点的序列。该路径至少包含一个节点,且不一定经过根节点。
在这里插入图片描述
思路:
本质:后序遍历,左右根。
如果左子树或者右子树的路径和小于0,那么就不进行计算(无效操作置0不需要考虑去除的概念)
res负责记录每个根节点处的最值(第i乘)
return返回上一层结点,

代码:

    int res = Integer.MIN_VALUE;
    public int maxPathSum(TreeNode root) {
        if(root==null) return 0;
        helper(root);             
        return res;
    }
    
    private int helper(TreeNode root) {
     if(root==null) return 0;
     int left = Math.max(helper(root.left), 0);
     int right = Math.max(helper(root.right), 0);
     res = Math.max(res, root.val+left+right);
     return root.val+(left>right ? left : right);
    }



LeetCode687最长同值路径

题目:

给定一个二叉树,找到最长的路径,这个路径中的每个节点具有相同值。 这条路径可以经过也可以不经过根节点。注意:两个节点之间的路径长度由它们之间的边数表示。
在这里插入图片描述

思路:

类似LeetCode124
利用递归:对于这种树的路径问题,递归是不二之选。在递归函数中,我们首先对其左右子结点调用递归函数,得到其左右子树的最大相同值路径,下面就要来看当前结点和其左右子结点之间的关系了:
如果其左子结点存在且和当前节点值相同,则left自增1,否则left重置0;同理,如果其右子结点存在且和当前节点值相同,则right自增1,否则right重置0。
然后用left+right来更新结果res(由于都和同一个root进行比较,所以可以直接利用left+right更新res)。而调用当前节点值的函数只能返回left和right中的较大值,因为如果还要跟父节点组path,就只能在左右子节点中选一条path,当然选值大的那个了
if(r.val == val) return Math.max(left, right) + 1;这句代码,需要区分r.val和val分别指带什么!

代码:

private int res= 0;
public int longestUnivaluePath(TreeNode root) {
    /**
    解题思路类似于124题, 对于任意一个节点, 如果最长同值路径包含该节点, 那么只可能是两种情况:
    1. 其左右子树中加上该节点后所构成的同值路径中较长的那个继续向父节点回溯构成最长同值路径
    2. 左右子树加上该节点都在最长同值路径中, 构成了最终的最长同值路径
    需要注意因为要求同值, 所以在判断左右子树能构成的同值路径时要加入当前节点的值作为判断依据
    **/
    if(root == null) return 0;
    getMaxL(root, root.val);
    return res;
}
private int getMaxL(TreeNode r, int val) {
    if(r == null) return 0;
    int left = getMaxL(r.left, r.val);
    int right = getMaxL(r.right, r.val);
    res = Math.max(res, left+right); // 路径长度为节点数减1所以此处不加1
    if(r.val == val) // 和父节点值相同才返回以当前节点所能构成的最长通知路径长度, 否则返回0
        return Math.max(left, right) + 1;
    return 0;
}
内容概要:本文针对国内加密货币市场预测研究较少的现状,采用BP神经网络构建了CCi30指数预测模型。研究选取2018年3月1日至2019年3月26日共391天的数据作为样本,通过“试凑法”确定最优隐结点数目,建立三层BP神经网络模型对CCi30指数收盘价进行预测。论文详细介绍了数据预处理、模型构建、训练及评估过程,包括数据归一化、特征工程、模型架构设计(如输入层、隐藏层、输出层)、模型编译与训练、模型评估(如RMSE、MAE计算)以及结果可视化。研究表明,该模型在短期内能较准确地预测指数变化趋势。此外,文章还讨论了隐层节点数的优化方法及其对预测性能的影响,并提出了若干改进建议,如引入更多技术指标、优化模型架构、尝试其他时序模型等。 适合人群:对加密货币市场预测感兴趣的研究人员、投资者及具备一定编程基础的数据分析师。 使用场景及目标:①为加密货币市场投资者提供一种新的预测工具和方法;②帮助研究人员理解BP神经网络在时间序列预测中的应用;③为后续研究提供改进方向,如数据增强、模型优化、特征工程等。 其他说明:尽管该模型在短期内表现出良好的预测性能,但仍存在一定局限性,如样本量较小、未考虑外部因素影响等。因此,在实际应用中需谨慎对待模型预测结果,并结合其他分析工具共同决策。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值