Path Sum算法详解

算法题目:Given a binary tree and a sum, determine if the tree has a root-to-leaf path such that adding up all the values along the path equals the given sum.

For example:
Given the below binary tree and sum = 22,
这里写图片描述
return true, as there exist a root-to-leaf path 5->4->11->2 which sum is 22.

大致意思:给定一颗二叉树,决定是否存在一条从根结点到叶子结点的路径,使路径上的每个结点值的总和等于给定的sum,存在返回true,否则返回false。注意:一定是从根结点到叶子结点!!!

思路:递归做法,每到一个结点,用sum减去该结点的值,然后判断该结点是否为叶子结点,若是,判断sum==0?并返回true或false,否则就继续递归下去,递归退出条件为:树为空,返回false

    bool hasPathCore(TreeNode* root,int sum)
    {
        if(root==NULL)return false;

        sum-=root->val;
        if(root->left==NULL&&root->right==NULL)
        {
            if(sum==0)return true;
            else return false;
        }

        if(hasPathCore(root->left,sum)||hasPathCore(root->right,sum))
            return true;
        else
            return false;
    }
    bool hasPathSum(TreeNode* root, int sum) {
        if(root==NULL)return false;
        return hasPathCore(root,sum);
    }
### ICP算法的详细原理 ICP(Iterative Closest Point,迭代最近点)是一种用于点云配准的经典算法。其核心目标是最小化两个点云之间的距离误差,从而找到最佳的空间变换关系[^1]。 #### 数学模型 ICP的核心问题是寻找一个刚体变换 \( T \),使得两组点云尽可能接近。假设给定点云 \( X = \{x_1, x_2, ..., x_n\} \) 目标点云 \( Y = \{y_1, y_2, ..., y_m\} \),则可以通过最小化以下能量函数来求解: \[ \min_T \frac{1}{2} \sum_{i=1}^{n} \| x_i - T(y_i) \|^2_2 \] 其中,\( T \) 表示由旋转平移组成的刚体变换矩阵[^3]。 --- ### ICP算法的主要步骤 尽管具体实现可能有所不同,但经典的ICP算法通常遵循以下几个阶段的操作逻辑: #### 1. 寻找对应点 对于每一个点 \( x_i \in X \),在目标点云 \( Y \) 中找到与其对应的最近邻点 \( y_j \)[^4]。这一步骤通常是通过计算欧几里得距离完成的。 #### 2. 计算最优变换 基于匹配好的点对集合 \( (x_i, y_i) \),估计使这些点对之间偏差最小化的刚体变换参数 \( R \) (旋转矩阵) \( t \) (平移向量)。这一过程可通过奇异值分解(SVD)或其他数值方法解决[^2]。 #### 3. 更新并重复 应用当前估算得到的变换到移动点云上,并评估新的残差误差。如果误差小于设定阈值或者达到最大迭代次数,则停止;否则返回第一步继续执行直到收敛为止[^1]。 --- ### 使用Open3D库实现ICP算法 以下是利用Python中的开源库 **Open3D** 进行简单ICP配准的一个例子: ```python import open3d as o3d import numpy as np # 加载点云数据 source = o3d.io.read_point_cloud("path_to_source.ply") target = o3d.io.read_point_cloud("path_to_target.ply") # 初始猜测转换矩阵 init_transformation = np.identity(4) # 执行ICP算法 reg_p2p = o3d.registration.registration_icp( source, target, max_correspondence_distance=0.02, init=init_transformation, estimation_method=o3d.registration.TransformationEstimationPointToPoint()) print(reg_p2p) final_transformed = reg_p2p.transformation ``` 此代码片段展示了如何加载两个PLY格式文件形式存储下来的三维扫描结果作为输入源(Target)以及待调整位置的目标(Source), 并设置初始姿态为单位阵列之后调用了`registration_icp()` 函数来进行精确校正操作[^2]. --- ### ICP算法的优点与局限性 - **优点** - 方法直观易懂; - 对噪声具有一定的鲁棒性,在实际应用场景中有较好的表现效果[^1]。 - **缺点** - 需要良好的初值才能保证正常工作,否则容易陷入局部极小值; - 时间复杂度较高,尤其是当处理大规模点集时效率较低[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值