代码随想录算法训练营55期第十五天 | 二叉树part03

OpenCV 算法梳理分析 本文系统梳理了OpenCV的核心算法体系,从模块架构到具体函数实现。OpenCV采用分层设计,包含基础I/O、图像处理、特征检测、视频分析和智能算法五大层次,所有模块基于统一的Mat数据结构。重点分析了imgproc模块的8类图像处理算法(滤波、形态学、阈值化等),features2d模块的特征检测与匹配流程(SIFT/ORB等算法对比),以及objdetect、video、calib3d等模块的核心功能。针对不同场景提供了算法选型建议,如高斯噪声推荐GaussianBlur,特征匹配推荐ORB+Flann 阅读详情
第一刷着重掌握递归,以能在OA中写出能通过的解法为目标,二刷再掌握迭代法

110.平衡二叉树 (优先掌握递归)

解题先看定义

height-balanced binary tree is a binary tree in which the depth of the two subtrees of every node never differs by more than one.

因为要计算每个node 左右子树的height,所以需要重新定义一个递归函数,返回当前节点为root的二叉树的高度。

优化:如果在某一个节点,左右子树已经不平衡了,也就是高度差大于1,没有比较继续计算高度,直接返回-1,表示该树不是二叉平衡树

* 求深度适合用前序遍历,而求高度适合用后序遍历。

class Solution {
    public boolean isBalanced(TreeNode root) {
        return height(root) != -1;
    }
    private int height(TreeNode root){
        //base case
        if(root == null){
            return 0;
        }
        //左
        int leftHeight = height(root.left);
        if(leftHeight == -1){
            return -1;
        }
        //右
        int rightHeight = height(root.right);
        if (rightHeight == -1){
            return -1;
        }
        //中
        return Math.abs(leftHeight - rightHeight) <= 1 ? Math.max(leftHeight, rightHeight) + 1 : -1 ;
    }
}

257. 二叉树的所有路径 (优先掌握递归)

这道题使用递归和回溯, 在遍历的过程度,记录遍历的节点,到达leaf 时,将结果放入List。

定义一个新的递归函数,节点,路径和结果集作为参数,不需要返回值。当找到leaf,左右子树为空,就终止递归

因为需要记录路径,所以为前序遍历


class Solution {
    public List<String> binaryTreePaths(TreeNode root) {
        List<String> ans = new ArrayList<>();
        List<Integer> path = new ArrayList<>();
        backTracking(root, path, ans);
        return ans;
    }
    private void backTracking(TreeNode root, List<Integer> path, List<String> ans){
        path.add(root.val);
        // reach a leaf
        if(root.left == null && root.right == null){
            StringBuilder sb = new StringBuilder();
            for(int i = 0; i < path.size() - 1; i++){
                sb.append(path.get(i)).append("->");
            }
            sb.append(path.get(path.size() - 1));
            ans.add(sb.toString());
            return;
        }
        if(root.left != null){
            backTracking(root.left, path, ans);
            path.remove(path.size() - 1);
        }
        if(root.right != null){
            backTracking(root.right, path, ans);
            path.remove(path.size() - 1);
        }
    }
}

404.左叶子之和 (优先掌握递归)

首先确定题意,左叶子首先是leaf, 而且是其parent的left child,所以这道题就是遍历所有node,通过父节点找到符合要求的左叶子。

确定终止条件:

如果遍历到空节点, 没有左叶子 ,return 0;

如果遍历到 叶子,也没有左叶子,return 0;

递归逻辑:

在父节点检测到左叶子,记录数值。递归求取左子树左叶子之和,和 右子树左叶子之和,然后返回数值之和。

class Solution {
    public int sumOfLeftLeaves(TreeNode root) {
        if(root == null) return 0;
        if(root.left == null && root.right == null) return 0;
       
        int leftValue = sumOfLeftLeaves(root.left);
        //left leaf
        if (root.left != null && root.left.left ==null && root.left.right== null){
            leftValue = root.left.val;
        }
        int rightValue = sumOfLeftLeaves(root.right);
        return leftValue + rightValue;

    }
}

222.完全二叉树的节点个数(优先掌握递归)

class Solution {
    public int countNodes(TreeNode root) {
        if(root == null) {
            return 0;
        }
        return countNodes(root.left) + countNodes(root.right) + 1;
    }
}

RFPDupeFilter 与请求指纹算法详解 Scrapy 2.17 去重源码详解:RFPDupeFilter 就是一个 set 加一个文件。拆解指纹算法,实测暴露默认端口与相对路径不归一化两个坑,给出规整中间件和自定义指纹方案。 阅读详情

相关推荐

Akamai-3.0补环境逆向-DHL快递查询

那么我们的请求过程就是:1.请求首页的html文件,通过re或xpath,提取到这个url,拼接官网地址,得到这个js文件的地址。返回的_abck为0,表示环境正确,请求搜索接口返回200,说明返回的_abck正确,如果过程错误或环境补的有问题会返回403或428这两个状态码。那么,就是这个包返回的,而且这个包需要请求两次,第一次get请求,返回的这个-1的cookie,第二次请求,带上一个sensor_data的参数,进行post请求,最终返回这个0的cookie,代表你过了akamai这个盾。

2302_76420666的博客 2773

小红书 算法一面 十一

例如 **Soft MoE** 采用这种方式,大幅提升负载均衡性,但会增加计算开销。- **熵正则化**:直接最大化门控概率分布的熵,熵越大表示分布越均匀,公式为 $\mathcal{L}_{ent} = -\frac{1}{N}\sum_{i=1}^N\sum_{k=1}^K p_{ik}\log p_{ik}$。- **核心原理**:源自 **GShard** 和 **Switch Transformer**,通过最小化专家选择概率分布的熵,迫使门控网络给每个专家分配相近的 token 数量。

XLYcmy的博客 440

北斗导航 | 从零开始学习基于奇偶矢量的接收机自主完好性监测(RAIM)算法及改进

接收机自主完好性监测(Receiver Autonomous Integrity Monitoring, RAIM)是GNSS接收机内部的一种算法,它仅利用冗余的伪距观测量来判断定位结果是否可靠、是否存在故障卫星,并能识别和排除故障卫星。奇偶矢量法是RAIM最经典的实现方式之一,它将不可直接观测的测量误差映射到一个“奇偶空间”中,使故障检测变得简单且服从精确的概率分布。w\mathbf{w}w虽然能反映故障,但它的协方差矩阵不是单位阵,各分量相关,不利于统计检验。奇偶矢量通过一个正交变换P。

尘世冰封的专栏 374

数据库连接算法详解:从基础概念到嵌套循环优化

2.重复键在归并连接中的处理:排序归并连接遇到相同键时,需要保存或回溯同一键对应的记录组,然后输出笛卡尔积。(2)外连接:即使一方没有数据,也保留该侧数据,用NULL填充。对S中的键计算哈希值;(3)连接基数:连接结果的行数可能远大于任意一张输入表。设外表有R个页面,内表S个页面,比较次数O(R+R*S)5.哈希连接的限制:最适用于等值连接,不直接适用于比较。(1)build阶段:对较小的关系R建立哈希表。(1)内连接:只保留两张表之中能够匹配的内容。若R有M行,S有N行,则比较次数为O(MN)

jiangxiaohanya的博客 242

【数据结构】排序算法:归并排序与基数排序

本文介绍了归并排序和基数排序两种非比较型排序算法。归并排序采用分治策略,通过递归分割与合并实现排序,时间复杂度稳定为O(nlogn),空间复杂度O(n),具有稳定性。基数排序则基于数字位数进行分配收集,时间复杂度O(d(n+r)),适用于固定位数的整数或字符串排序。文章通过示例详细说明了两者的执行过程,并对比了八大排序算法的关键特性,包括时间复杂度、空间复杂度和稳定性。最后通过典型例题展示了两种排序的应用场景和解题思路,强调归并排序的分治思想和基数排序的LSD实现是考试重点。(149字)

bianyuan172的博客 287

LeetCode 1. 两数之和 | 从暴力枚举到哈希表最优解 + 空间换时间思想全复盘

文章摘要 题目要求在数组中找到两数之和等于目标值的下标。核心思路是优化查找效率: 暴力法:双重循环枚举所有数对,时间复杂度O(n²),效率低但易实现。 哈希表优化:利用哈希表O(1)查找特性,遍历时存储已访问元素,每次计算差值并查询,时间复杂度降至O(n)。关键细节是先查后存,避免自匹配。 代码实现:哈希表法通过一次遍历完成,空间换时间,边界处理需注意空数组和不足两元素的情况。 常见错误:内层循环起始点、哈希表键值设计、立即返回结果等易错点需警惕。 面试要点:优先选择哈希表解法,解释与暴力法的差异,强调时间

yc2284238579的博客 261

算法日常・每日刷题--<BFS>4

题目摘要: 给定一个由'X'和'O'组成的矩阵,要求捕获所有被'X'完全包围的'O'区域(即不与边界连通的区域),并将其替换为'X'。解法核心是逆向处理: 标记边界连通区域:遍历矩阵四边,对边界上的'O'进行BFS/DFS,标记所有与之连通的'O'为临时符号(如'.'),表示这些区域未被包围。 批量修改:遍历整个矩阵,将未被标记的'O'(被包围的)改为'X',同时恢复标记的'.'为'O'。 示例: 输入: [['X','X','X','X'], ['X','O','O','X'], ['X','X','O'

2503_92261635的博客 259

10.LeetCode算法习题讲解--滑动窗口--最大连续为一的个数

利用滑动窗口解决最大连续1的个数

Jammy_1的博客 224

算法日常・每日刷题--<BFS&&最短路径>4

675. 为高尔夫比赛砍树 - 力扣(LeetCode)675. 为高尔夫比赛砍树 - 你被请来给一个要举办高尔夫比赛的树林砍树。树林由一个 m x n 的矩阵表示, 在这个矩阵中: * 0 表示障碍,无法触碰 * 1 表示地面,可以行走 * 比 1 大的数 表示有树的单元格,可以行走,数值表示树的高度每一步,你都可以向上、下、左、右四个方向之一移动一个单位,如果你站的地方有一棵树,那么你可以决定是否要砍倒它。你需要按照树的高度从低向高砍掉所有的树,每砍过一颗树,该单元格的值变为 1(即变为地面)。

2503_92261635的博客 203

S 曲线加减速算法完整详解(C# 原生实现,无第三方库)

S 曲线加减速是工业运动控制核心轨迹规划算法,相比梯形曲线,依靠约束加加速度 Jerk 实现加速度连续变化,有效消除机械冲击与振动。本文完整讲解七段式 S 曲线原理、阶段推演、时间预规划逻辑,剖析短行程自动裁剪等工程难点。提供无第三方依赖原生 C# 完整实现,内置运动状态机,支持正反方向运动,基于解析多项式实时求解位置、速度、加速度,无积分累积误差。代码可直接用于伺服上位机、模组轨迹发生器,亦可精简移植嵌入式平台。同时对比算法优劣与适用场景,适合工控开发、伺服调试、嵌入式运动算法学习者参考。

工业上位机开发工程师,专注C#底层算法与工控仪器开发。从零手写信号滤波、曲线拟合、机器视觉、排序与密码学哈希,纯原生实现零第三方库,附数学推导与可编译源码,可移植STM32/PLC。 987

Tokenization(分词算法):一切大语言模型的地基

本文深入解析了Tokenization(分词算法)这一大语言模型的基础技术。Tokenization将原始文本切分为模型可处理的子词单元并映射为数字ID,是模型理解文本的第一步。

2301_80194949的博客 205

LeetCode 28. 找出字符串中第一个匹配项的下标(暴力匹配 + KMP 算法详解)

本文介绍了LeetCode 28题"找出字符串中第一个匹配项的下标"的两种解法:暴力匹配和KMP算法。暴力匹配通过逐个字符比较实现,时间复杂度O(m×n);KMP算法利用next数组跳过不必要匹配,时间复杂度O(m+n)。文章详细解释了KMP的核心思想,包括next数组的定义和构建过程,并提供了Python和Java的代码实现。两种方法各具特点:暴力匹配简单直观,KMP更高效但实现复杂,适合处理长字符串匹配问题。

2603_95532426的博客 231

一文读懂:字典序的第K小数字

可以按照层次遍历子树,firsti 指向第 i 层的最左侧的孩子节点, lasti 指向第 i 层的最右侧的孩子节点,根据推理可以知道: firsti = 10 × firsti − 1 ,lasti = 10 × lasti − 1 + 9 ,第 i 层共有 lasti − firsti + 1 个节点,由于所有的节点都需要满足小于等于 n ,所以第 i 层的最右侧节点应该为 min(n,lasti) ,不断迭代直到 firsti > n 则终止向下搜索。

2501_92927469的博客 214

算法效率的度量(上):时间复杂度中的对数思维

本文系统讲解算法时间复杂度的分析方法,重点解析对数和对数线性复杂度。主要内容包括:1)大O表示法的核心规则(保留最高阶项、忽略系数);2)对数复杂度O(logN)的三种典型场景(循环折半、二分查找、递归折半);3)对数线性复杂度O(NlogN)的结构特征(线性遍历嵌套折半操作);4)提供快速判断口诀和5道典型练习题(含递归分析)。通过代码示例和数学推导,揭示复杂度分析的本质是观察问题规模的缩减速度。

Guangyu536的博客 205

关于字符串【力扣151.反转字符串中的单词的思考】

【摘要】本文介绍了字符串反转问题的解决方案。通过三个关键步骤实现:首先去除多余空格,然后整体反转字符串,最后逐个反转单词。方法强调函数封装思想,将不同功能模块化处理。注意事项指出需特别关注函数封装在代码复用和维护中的重要性,这种分步处理方法能有效提高代码可读性和执行效率。

wasb666的博客 495

LeetCode 53 最大子数组和:一次遍历掌握 Kadane 算法

本文围绕 LeetCode 53“最大子数组和”展开,详细介绍 Kadane 算法的核心思想。通过定义以当前位置结尾的最大子数组和,判断是延续原有子数组还是从当前元素重新开始,并在遍历过程中维护全局最大值。文章结合示例演算、Java 代码和状态转移公式,分析全负数数组等边界情况,总结常见错误。该算法时间复杂度为 O(n),空间复杂度为 O(1)。

weixin_51228134的博客 494

leetcode 104二叉树的最大深度

为根的树深度是 1。

qq_63176310的博客 239

算法札记:利用floyd判环算法优化SPFA判负环算法

本文提出了一种优化SPFA算法检测负环的方法,使用Floyd判环算法替代传统的DFS判环。作者在SPFA中增加了计时器和Floyd判环(龟兔赛跑算法),当步数超过2n时启动判环检查。代码实现中,cycle()函数实现了Floyd判环逻辑,通过比较慢指针和快指针来检测环的存在。经测试,该优化在Acwing平台上比朴素SPFA快50倍,比基于栈的优化版本快1.2-1.4倍。这种方法显著提高了负环检测效率,尤其适用于大规模图论问题。

Keven_11的博客 296

分治题目:所有可能的真二叉树

二叉树中只有一个结点时,唯一的结点是根结点,没有子结点,因此是真二叉树,此时真二叉树中的结点数是奇数。个结点的真二叉树满足左子树和右子树的结点数都是奇数且左子树和右子树的结点数之和是。个结点时,将其中一个叶结点增加两个子结点之后仍为真二叉树,新的真二叉树中有。是奇数时,遍历左子树和右子树的结点数,然后递归地构造左子树和右子树。根据真二叉树的定义,真二叉树中的每个结点的子结点数是。真二叉树中的结点数是奇数,可以使用数学归纳法证明。答案的每个元素都是一个真二叉树的根结点。时只有一个结点的二叉树是真二叉树

stormsunshine的博客 162

10年上位机开发踩过的20个坑:C#通信/线程/UI适配避坑指南

通信层:所有通信操作异步化、异常全覆盖,加断线重连+心跳检测,多设备隔离资源;线程层:UI更新必做跨线程判断,共享数据加锁,线程池限流,异常不静默;UI层:适配高分屏/DPI,用布局容器替代固定坐标,多屏场景绑定主屏幕。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 867

HPE 服务器 iLO 4 firmware固件升级 v2.77

HPE 服务器 iLO 4 firmware固件升级 v2.77 DL380 Gen9 DL20 Gen9 DL380e Gen8 DL380p Gen8 ML310e Gen8 v2 DL320e Gen8 v2

上一篇: 代码随想录算法训练营55期第十四天 | 二叉树part02
下一篇: 代码随想录算法训练营55期第十六天 | 二叉树part04
scorecpl
博客等级 码龄4年 73粉丝 30原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值