【代码随想录】刷题Day21

news2024/9/23 13:00:11

1.二叉搜索树的最小绝对值

530. 二叉搜索树的最小绝对差

首先对于单个节点而言,其最小绝对值有两个可能

一是根节点和左节点的最右节点绝对值

二是根节点和右节点的最左节点绝对值

其实这俩条件的实现就是我们代码的关键,不过这题和二叉搜索树的判断殊途同归,其实都是分别访问了左右节点的最右最左节点。那么写起来就简单了,无非要更新一下最小值。

class Solution {
public:
    void _getMiniR(TreeNode* root,int& min)
    {
        if(root==nullptr)
            return;
        int tmp;
        if(root->left)
        {
            TreeNode* left = root->left;
            while(left)
            {
                tmp = abs(left->val-root->val);
                if(tmp<min)
                    min = tmp;
                left=left->right;
            }
        }
        if(root->right)
        {
            TreeNode* right = root->right;
            while(right)
            {
                tmp = abs(right->val-root->val);
                if(tmp<min)
                    min = tmp;
                right=right->left;
            }
        }
        _getMiniR(root->left,min);
        _getMiniR(root->right,min);
    }
    int getMinimumDifference(TreeNode* root) {
        int min = 100000;
        _getMiniR(root,min);
        return min;
    }
};

2.二叉搜索树的众数

501. 二叉搜索树中的众数

我们知道哈希表的map能够统计次数,所以递归+map应该就能实现对二叉搜索树的查找

1.在外面定义一个map,引用传入递归函数,将根节点的数统计到map中,随后左右递归

2.我们先要知道哪个数是最大的,所以先要有一个变量来存储遍历map后出现次数的最大值,当然此时我们要比较的是maxnum和map元素的second。

3.找到对应的maxnum后,我们再次遍历,将second和maxnum一样的元素,其对应的first传入到vector中

lass Solution {
public:
    void _findModeR(TreeNode* root,unordered_map<int,int>& um)
    {
        if(root==nullptr)
            return;
        um[root->val]++;
        _findModeR(root->left,um);
        _findModeR(root->right,um);
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> ret;
        int num;
        unordered_map<int,int> um;
        _findModeR(root,um);
        int maxnum = 0;
        for(auto& e:um)
        {
            if(e.second>maxnum)
                maxnum=e.second;
        }
        for(auto& e:um)
        {
            if(e.second==maxnum)
                ret.push_back(e.first);
        }
        return ret;
    }
};

但是这样没有什么针对性,因为按照这个函数,所有二叉树都能通过这个函数实现。而我们要知道的是二叉搜索树的中序遍历,得到的结果其实是有顺序的,从小到大。那么我们可以用这个特性来做该题。

我们先中序遍历得到顺序vector,并且在此期间,通过比较数据是否相同获得出现最多次相同数值的个数maxnum。

随后我们设置两个指针left和right,他们两个下标的距离始终保持为maxnum,所以初始的left=0,right=left+maxnum-1,使得我们可以来循环判断(循环结束的条件是right超过范围):

1.如果v[left]和v[right]不相同,说明此时的left的数据不是最大相同数,left和right都往后加一

2.如果两个相同,说明该值就是我们需要的数,push_back到ret中,随后更新left为right+1,right更新为left+maxnum-1

class Solution {
public:
    int maxnum = 0;
    int num = 0;
    int tmp = 0;
    void GetVector(TreeNode* root,vector<int>& v)
    {
        if(root==nullptr)
            return;
        GetVector(root->left,v);
        v.push_back(root->val);
        if(tmp==root->val)
            num++;
        else
        {
            tmp=root->val;
            num = 1;
        }
        if(maxnum<num)
            maxnum = num;
        GetVector(root->right,v);
    }
    vector<int> findMode(TreeNode* root) {
        vector<int> v;
        vector<int> ret;
        GetVector(root,v);
        int left = 0;
        int right = left+maxnum-1;
        while(right<v.size())
        {
            if(v[left++]!=v[right++])
            {
                ret.push_back(v[left]);
                left=right+1;
                right=left+maxnum-1;
            }
            else
            {
                left++;
                right++;
            }
        }
        return ret;
    }
};

3.二叉树公共祖先

为了让上层节点知道下层的节点是否是p或者q,所以我们使用的遍历是后序遍历

1.如果root为空,返回空

2.如果root等于q或者p,说明此时节点是我们要返回的q或者p节点,那么我们此时要返回的是root

3.随后是后序遍历的左右递归,分别对left和right递归,并且获取由下传到上的节点

4.中间操作就是判断是否是我们要往上返回的:

如果左右都有,说明此时root就是公共祖先,那么我们返回root即可

如果右边有,左边没有,说明公共祖先在右边;或者找到了一个节点(q或者p任意一个),此时我们要返回的就是右节点

如果右边没有,左边有,其实思路是相同的,返回左节点

最后如果都不是,说明此时不是我们要的值,我们应该返回nullptr,告诉上层,下面没有找到p和q节点

class Solution {
public:
    TreeNode* lowestCommonAncestor(TreeNode* root, TreeNode* p, TreeNode* q) {
        if(root==nullptr)
            return nullptr;
        if(root==p||root==q)
            return root;
        TreeNode* left=lowestCommonAncestor(root->left,p,q);
        TreeNode* right=lowestCommonAncestor(root->right,p,q);
        if(left&&right)
            return root;
        if(!left&&right)
            return right;
        else if(left&&!right)
            return left;
        else
            return nullptr;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/505499.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Es分布式搜索引擎

目录 一、什么是ES&#xff1f; 二、什么是elk&#xff1f; 三、什么是倒排索引&#xff1f; 四、正向索引和倒排索引的优缺点对比 五、mysql数据库和es的区别&#xff1f; 六、索引库&#xff08;es中的数据库表&#xff09;操作有哪些&#xff1f; 八、ES分片存储原理 …

AutoCV第七课:ML基础

目录 ML基础前言1. 复习sqrt函数2. 线性回归预测房价2.1 问题分析2.2 代码实现2.3 总结 个人总结 ML基础 前言 手写AI推出的全新保姆级从零手写自动驾驶CV课程&#xff0c;链接。记录下个人学习笔记&#xff0c;仅供自己参考。 本次课程主要学习复习 sqrt 函数和线性回归预测房…

Java开发手册-8

Java开发手册-8 MySQL 数据库SQL语句ORM映射 工程结构应用分层二方库依赖 MySQL 数据库 SQL语句 【强制】不要使用count(列名)或count(常量)来替代count(*)&#xff0c;count(*)是SQL92定义的标准统计行数的语法&#xff0c;跟数据库无关&#xff0c;跟NULL和非NULL无关。 说…

深入了解云计算:发展历程、服务与部署模型、未来趋势与挑战

开篇博主 bluetata 的观点&#xff1a;PaaS 服务必将是未来10年云计算权重最高的趋势&#xff08;05/02/2023 15:32&#xff09; 文章目录 一、前言二、认识了解云计算2.1 什么是云计算2.1.1 维基百科上的云计算定义2.1.2 NIST 标准云计算定义2.1.3 如果被面试如何解释云计算 2…

177_模型_Power BI 进销存6大日期维度期初与期末

177_模型_Power BI 进销存6大日期维度期初与期末 一、背景 在经销存报表设计中&#xff0c;经常会遇到的便是期初与期末。当然我们这里说期初与期末指的是期初库存与期末库存。 这里的期一般常见的会有&#xff1a;年月日。本案例将演示 6 大日期维度&#xff0c;分别是&…

(二)运行微信小程序:单页面和多页面

使用微信开发者工具创建项目后&#xff0c;默认将运行一个单页面的小程序&#xff0c;运行效果和文件对应修改处如下。 根据上图&#xff0c;通过修改对应内容&#xff0c;可以修改界面显示的文字。 这是一个单页面的小程序&#xff0c;假如要实现多页面的小程序&#xff0c;我…

基于matlab使用被动声纳系统定位声学信标

一、前言 此示例演示如何模拟被动声纳系统。固定的水声信标由浅水通道中的拖曳无源阵列检测和定位。声信标以每秒 10.37 千赫兹的速度传输 5 毫秒脉冲&#xff0c;并建模为各向同性投影仪。定位器系统在表面下方拖曳一个无源阵列&#xff0c;该阵列被建模为均匀线性阵列。一旦检…

电磁兼容三要素和三规律

EMC是业界的一个难点&#xff1b;来谈谈EMC三个规律、EMC问题三要素、电磁骚扰的特性、以及五层次EMC设计法。 EMC改进要如诊治疾病一样对症施治&#xff1b;我们倡导坚持EMC规律&#xff0c;趁早考虑和解决EMC问题-进行EMC设计。下面我们认识以下EMC领域的三个要 素和三个重要…

二十四、SQL 数据分析实战(12个简单的SQL题目)

文章目录 题目1: "双十一"活动的电商GMV分析题目2: 网站访问量分析题目3: 用户购物信息统计题目4: 连续售出的商品题目5: 奇偶互换位置题目6: 商品销量同环比题目7: 文本记录连接题目8: 行列互换题目9: 寻找符合要求的订单题目10: 优惠券使用分析题目11: 员工绩效考核…

国产仪器 3986A/3986D/3986E/3986F/3986H噪声系数分析仪

3986系列噪声系数分析仪产品包括3986A(10MHz&#xff5e;4GHz)、3986D(10MHz&#xff5e;18GHz)、3986E(10MHz&#xff5e;26.5GHz)、3986F(10MHz&#xff5e;40GHz)和3986H(10MHz&#xff5e;50GHz)&#xff0c;具有频率覆盖范围宽、频段选择灵活、接收灵敏度高、用户界面友好…

玩客云直刷armbian自带宝塔7.5

文章目录 前言一、短接玩客云1.1、流程1.2、短接操作 二、获取固件底包2.1、下载固件2.2、刷入成功后获取ip地址2.3、登陆2.4、其他 总结 前言 一开始25买了一个玩客云&#xff08;主机电源&#xff09;玩玩&#xff0c;成功刷入armbian&#xff0c;但是就是安装不了宝塔&…

MGV2000_2+16_当贝纯净桌面卡刷固件包-内有教程

MGV2000_216_当贝纯净桌面卡刷固件包-内有教程 特点&#xff1a; 1、适用于对应型号的电视盒子刷机&#xff1b; 2、开放原厂固件屏蔽的市场安装和u盘安装apk&#xff1b; 3、修改dns&#xff0c;三网通用&#xff1b; 4、大量精简内置的没用的软件&#xff0c;运行速度提…

什么是零拷贝?

零拷贝 什么是零拷贝 零拷贝指的是&#xff0c;从一个存储区域到另一个存储区域的copy任务无需CPU参与就可完成。零拷贝的底层是 通过DMA总线技术实现的。零拷贝与具体的编程语言无关&#xff0c;完全依赖于OS&#xff0c;OS支持就可使用&#xff0c;不支持 设置了也不起作用…

MySQL基础(二十二)逻辑架构

1.逻辑架构剖析 1.1 第1层&#xff1a;连接层 系统&#xff08;客户端&#xff09;访问MySQL服务器前&#xff0c;做的第一件事就是建立TCP连接。 经过三次握手建立连接成功后&#xff0c;MySQL服务器对TCP传输过来的账号密码做身份认证、权限获取。 用户名或密码不对&#…

单脉冲测角和差波束法原理

和差波束测角及仿真 和差波束法原理MATLAB仿真 和差波束法原理 和差波束法是等信号测角方法中的一种&#xff0c;该方法利用两个形状完全相同但是部分重叠的波束&#xff0c;两个波束再形成和波束和差波束&#xff0c;由和差波束测量目标回波的入射角。 如下图所示&#xff0c…

seL4 操作系统微内核生态-ACM协会

美国计算机协会 (ACM) 将 2022 年 ACM 软件系统奖项授予 seL4 微内核团队。 SeL4是世界上第一个通过数学方法被证明安全的操作系统内核&#xff0c;并且在安全的基础上还强调高性能&#xff0c;是世界上最快、最先进的 OS 微内核。它对于嵌入式计算系统的安全可信赖方面将会有极…

先人一步了解Go 1.21版本新特性前瞻

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"&#xff01; 作者&#xff1a;tonybai|慕课网讲师 正在如火如荼地开发当中&#xff0c;按照Go核心团队的一年两次的发布节奏来算&#xff0c;Go 1.21…

【Java入门合集】第四章继承(二)

博主&#xff1a;命运之光 专栏&#xff1a;JAVA入门 学习目标 1.掌握继承性的主要作用、实现、使用限制&#xff1b; 2.掌握this和super的含义及其用法&#xff1b; 3.掌握方法覆写的操作&#xff1b; 4.掌握final关键字的使用&#xff1b; 5.掌握类变量、实例变量和局部变量的…

Cyanine5 maleimide马来酰亚胺活化荧光染料Cy5;1437872-46-2

CY5-MAL细胞标记是一种用于标记细胞的荧光染料&#xff0c;它可以被用于多种应用中。首先&#xff0c;CY5-MAL细胞标记可以被用于活细胞成像。通过将CY5-MAL细胞标记与活细胞结合&#xff0c;可以使细胞在显微镜下清晰可见。这种技术可以被用于研究细胞的结构和功能。其次&…

linux彻底卸载mysql步骤

第一步&#xff0c;先查看是否安装了mysql mysql -u root -p 如果提示bash: mysql: command not found...则没有安装过mysql 如果提示需要输入密码&#xff0c;那就证明安装了mysql 第二步&#xff0c;查看mysql运行状态并关闭 先查看下mysql的运行状态&#xff08;如果已经…