练习题(2024/5/7)

1验证二叉搜索树

给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。

有效 二叉搜索树定义如下:

  • 节点的左

    子树

    只包含 小于 当前节点的数。
  • 节点的右子树只包含 大于 当前节点的数。
  • 所有左子树和右子树自身必须也是二叉搜索树。

示例 1:

输入:root = [2,1,3]
输出:true

示例 2:

输入:root = [5,1,4,null,null,3,6]
输出:false
解释:根节点的值是 5 ,但是右子节点的值是 4 。

提示:

  • 树中节点数目范围在[1, 104] 内
  • -231 <= Node.val <= 231 - 1

思路1:

中序遍历下,输出的二叉搜索树节点的数值是有序序列。

有了这个特性,验证二叉搜索树,就相当于变成了判断一个序列是不是递增的了 我们把二叉树转变为数组来判断,是最直观的

通过中序遍历将二叉搜索树转换为有序数组,然后检查该数组是否严格递增。中序遍历保证了二叉搜索树的节点按照从小到大的顺序被访问,因此如果数组中存在相邻元素相等或逆序,则说明不满足二叉搜索树的性质

代码:

class Solution {
private:vector<int> vec;void traversal(TreeNode* root) {if (root == NULL) return;traversal(root->left);vec.push_back(root->val); // 将二叉搜索树转换为有序数组traversal(root->right);}
public:bool isValidBST(TreeNode* root) {vec.clear(); // 清空数组traversal(root);for (int i = 1; i < vec.size(); i++) {// 判断是否是二叉搜索树的条件if (vec[i] <= vec[i - 1]) return false;}return true;}
};

思路2:

不用转变成数组,可以在递归遍历的过程中直接判断是否有序。

利用递归来检查二叉搜索树的有效性。首先,通过递归遍历左子树,确保左子树是一个有效的二叉搜索树;然后,检查当前节点是否大于前一个节点(中序遍历时前一个节点的值),如果不是则返回 false;最后,递归遍历右子树,确保右子树也是一个有效的二叉搜索树。整体思路是基于二叉搜索树的性质,即左子树的所有节点小于根节点,右子树的所有节点大于根节点。

代码:

class Solution {
public:TreeNode* pre = NULL; // 用来记录前一个节点// 检查是否为有效的二叉搜索树bool isValidBST(TreeNode* root) {if (root == NULL) return true;bool left = isValidBST(root->left); // 检查左子树// 如果前一个节点不为空且大于等于当前节点的值,则不是二叉搜索树if (pre != NULL && pre->val >= root->val) return false;pre = root; // 记录前一个节点bool right = isValidBST(root->right); // 检查右子树return left && right;}
};

思路3:

迭代法解题思路是基于中序遍历二叉搜索树的特性。首先,我们使用一个栈来模拟中序遍历过程。从根节点开始,将所有左子节点依次入栈,直到最左的叶子节点。然后,开始出栈操作,每次出栈一个节点,判断其值是否大于前一个访问的节点值(如果有的话)。如果不是,则说明不满足二叉搜索树的定义,直接返回 false。如果满足,则更新前一个访问的节点,并将当前节点的右子节点入栈。这样,通过迭代遍历整个树,如果全部节点都满足二叉搜索树的定义,则返回 true

代码:

class Solution {
public:// 判断是否为有效的二叉搜索树bool isValidBST(TreeNode* root) {stack<TreeNode*> st; // 创建一个栈TreeNode* cur = root; // 当前节点指针TreeNode* pre = NULL; // 记录前一个节点while (cur != NULL || !st.empty()) {if (cur != NULL) {st.push(cur);cur = cur->left; // 遍历左子树} else {cur = st.top(); // 中序遍历当前节点st.pop();// 如果当前节点值小于等于前一个节点值,则不是二叉搜索树if (pre != NULL && cur->val <= pre->val)return false;pre = cur; // 保存前一个访问的结点cur = cur->right; // 遍历右子树}}return true;}
};

2二叉搜索树的最小绝对差

给你一个二叉搜索树的根节点 root ,返回 树中任意两不同节点值之间的最小差值 。

差值是一个正数,其数值等于两值之差的绝对值。

示例 1:

输入:root = [4,2,6,1,3]
输出:1

示例 2:

输入:root = [1,0,48,null,null,12,49]
输出:1

提示:

  • 树中节点的数目范围是 [2, 104]
  • 0 <= Node.val <= 105

思路:

首先,通过中序遍历二叉搜索树,将节点值按照从小到大的顺序存储在一个数组中。这样,得到的数组就是一个有序数组。然后,遍历这个有序数组,计算相邻两个节点值的差值,找出其中的最小值,即为任意两节点的最小差值。整体思路是利用中序遍历得到有序数组的特性,然后在有序数组上进行差值计算,从而求得最小差值。

代码:

class Solution {
private:vector<int> vec; // 存储中序遍历后的有序数组// 中序遍历二叉树,将节点值存入有序数组中void traversal(TreeNode* root) {if (root == NULL) return;traversal(root->left);vec.push_back(root->val); // 将二叉搜索树转换为有序数组traversal(root->right);}public:// 计算二叉搜索树任意两节点的最小差值int getMinimumDifference(TreeNode* root) {vec.clear(); // 清空有序数组traversal(root); // 中序遍历,得到有序数组if (vec.size() < 2) return 0; // 如果节点数量小于2,直接返回0int result = INT_MAX; // 初始化结果为最大值// 遍历有序数组,计算相邻节点的差值,找出最小的差值for (int i = 1; i < vec.size(); i++) {result = min(result, vec[i] - vec[i-1]);}return result; // 返回最小差值}
}; 

思路2:

在中序遍历的过程中,每次比较当前节点和前一个节点的差值,更新最小差值的结果。首先初始化一个最大值作为结果变量,一个空指针pre用于保存前一个节点的指针。然后进行中序遍历,遍历左子树,比较当前节点和前一个节点的值,更新结果。每次遍历完成后,更新pre指针,继续遍历右子树。最终返回计算得到的最小差值。整体思路是通过中序遍历一次得到有序数组,但是在计算最小差值的过程中,不需要保存整个数组,只需要保存前一个节点指针进行比较即可。

代码:

class Solution{
private:int result=INT_MAX; // 存储节点值最小差值的结果TreeNode* pre=NULL; // 前一个访问的节点指针,用于计算相邻节点的差值void traversal(TreeNode *cur){if(cur == nullptr) return; // 递归终止条件traversal(cur->left); // 左子树递归遍历if(pre != nullptr){result = min(result, cur->val-pre->val); // 更新最小差值}pre = cur; // 更新前一个访问的节点traversal(cur->right); // 右子树递归遍历}
public:int getMinimumDifference(TreeNode* root){traversal(root); // 递归遍历整个二叉搜索树return result; // 返回最小差值结果}
}; // 加中文注释

3二叉搜索树中的众数

给你一个含重复值的二叉搜索树(BST)的根节点 root ,找出并返回 BST 中的所有 众数(即,出现频率最高的元素)。

如果树中有不止一个众数,可以按 任意顺序 返回。

假定 BST 满足如下定义:

  • 结点左子树中所含节点的值 小于等于 当前节点的值
  • 结点右子树中所含节点的值 大于等于 当前节点的值
  • 左子树和右子树都是二叉搜索树

示例 1:

输入:root = [1,null,2,2]
输出:[2]

示例 2:

输入:root = [0]
输出:[0]

提示:

  • 树中节点的数目在范围 [1, 104] 内
  • -105 <= Node.val <= 105

思路:

既然是搜索树,它中序遍历就是有序的

在中序遍历的过程中,通过比较当前节点和前一个节点的值来统计当前节点出现的次数,同时更新最大出现次数和众数结果。首先初始化计数变量count和最大出现次数变量maxCount,以及存储结果的vector。然后进行中序遍历,遍历左子树,比较当前节点和前一个节点的值,更新计数。如果当前节点的值与前一个节点相同,则增加计数;否则重新设置计数为1。更新前一个访问的节点指针pre,并根据计数更新结果和最大出现次数。最终返回存储众数结果的vector。整体思路是在中序遍历的过程中,通过比较当前节点和前一个节点的值来统计出现次数,同时更新最大出现次数和众数结果,最终返回找到的众数值。

代码:

class Solution{
private:int count=0; // 统计当前节点出现的次数int maxCount =0; // 统计最大出现次数vector<int> result; // 存储众数的结果TreeNode* pre =nullptr; // 前一个访问的节点指针void searchBST(TreeNode* cur){if(cur ==nullptr) return; // 递归终止条件searchBST(cur->left); // 左子树递归遍历if(pre ==nullptr) {count=1; // 初始情况下设置当前节点出现次数为1} else if(pre->val== cur->val){count++; // 当前节点值与前一个节点相同,增加计数} else {count=1; // 当前节点值与前一个节点不同,重新设置计数为1} pre =cur; // 更新前一个访问的节点if(count ==maxCount){result.push_back(cur->val); // 结果中添加当前众数}if(count>maxCount){maxCount=count; // 更新最大出现次数result.clear();result.push_back(cur->val); // 清空结果,加入当前节点值}searchBST(cur->right); // 右子树递归遍历return;}public:vector<int> findMode(TreeNode* root){count=0; // 初始化变量maxCount =0;pre=nullptr;result.clear();searchBST(root); // 开始搜索二叉搜索树return result; // 返回众数结果}
};

4查找拥有有效邮箱的用户

表: Users

+---------------+---------+
| Column Name   | Type    |
+---------------+---------+
| user_id       | int     |
| name          | varchar |
| mail          | varchar |
+---------------+---------+
user_id 是该表的主键(具有唯一值的列)。
该表包含了网站已注册用户的信息。有一些电子邮件是无效的。

编写一个解决方案,以查找具有有效电子邮件的用户。

一个有效的电子邮件具有前缀名称和域,其中:

  1.  前缀 名称是一个字符串,可以包含字母(大写或小写),数字,下划线 '_' ,点 '.' 和/或破折号 '-' 。前缀名称 必须 以字母开头。
  2.  为 '@leetcode.com' 。

以任何顺序返回结果表。

结果的格式如以下示例所示:

示例 1:

输入:
Users 表:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 2       | Jonathan  | jonathanisgreat         |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
| 5       | Marwan    | quarz#2020@leetcode.com |
| 6       | David     | david69@gmail.com       |
| 7       | Shapiro   | .shapo@leetcode.com     |
+---------+-----------+-------------------------+
输出:
+---------+-----------+-------------------------+
| user_id | name      | mail                    |
+---------+-----------+-------------------------+
| 1       | Winston   | winston@leetcode.com    |
| 3       | Annabelle | bella-@leetcode.com     |
| 4       | Sally     | sally.come@leetcode.com |
+---------+-----------+-------------------------+
解释:
用户 2 的电子邮件没有域。 
用户 5 的电子邮件带有不允许的 '#' 符号。
用户 6 的电子邮件没有 leetcode 域。 
用户 7 的电子邮件以点开头

思路:

从名为Users的表中选择user_idnamemail这三个字段,并使用正则表达式来筛选出以字母开头,后面跟着字母、数字、下划线、点或连字符的字符串,最后以@leetcode.com结尾的邮箱地址

代码:

select  user_id, name, mail
from Users
-- 转义了`@`字符,因为它在某些正则表达式中具有特殊意义
where mail regexp '^[a-zA-Z][a-zA-Z0-9_.-]*\\@leetcode\\.com$'; -- 匹配以字母开头,后面跟着字母、数字、下划线、点或连字符的字符串,最后以`@leetcode.com`结尾的邮箱地址

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

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

相关文章

互联网十万个为什么之什么是云计算

云计算是一种通过互联网提供计算资源和服务的技术。它允许用户随时随地访问和使用云平台上的数据、软件和硬件资源。在数字化时代&#xff0c;互联网已经成为基础设施。云计算使得数据中心能够像一台计算机一样去工作。通过互联网将算力以按需使用、按量付费的形式提供给用户&a…

城市二手房数据分析与房价预测

实现功能 数据分析 二手房价格-时间分析 二手房数量-时间分析 二手房分布-区域分析 二手房户型分析 二手房朝向分析 二手房价格-区域分析 二手房热词词云 房价预测 采用合适的算法模型&#xff0c;对模型进行评估。通过输入影响因素输出预测价格。 采用技术与框架 M…

【MM32F3270 Micropython】pwm输出

文章目录 前言一、PWM脉宽调制技术介绍二、machine.PWM 类2.1 machine.PWM 类的构造对象2.2 PWM 对象初始化2.3 关闭PWM设备2.4 设置pwm的周期2.5 设置占空比 三、pwm示例代码总结 前言 MicroPython是一种精简的Python 3编程语言实现&#xff0c;旨在在微控制器和嵌入式系统上…

从0到1提审苹果商店(appstore)上线一款新APP

本篇主要复盘和介绍一款APP如何从0到1上线到苹果商店,将我自己项目遇到的坑跟大家分享,希望能为同样做开发或者运营的你提供经验,少走弯路。 如果你是24年1月1日之后开始首次提审APP,还需要先将自己的APP在工信部备案,苹果后台增加了工信部备案号的填写,备案方法和经验如…

揭秘 IEEE/ACM Trans/CCF/SCI,谁才是科研界的王者?

会议之眼 快讯 在学术探索的浩瀚星海中&#xff0c;每一篇论文都像是一颗璀璨的星辰&#xff0c;而那些被顶级期刊或会议收录的论文&#xff0c;则无疑是最耀眼的几颗。 在众多评价标准中&#xff0c;IEEE/ACM Transactions、CCF推荐期刊和会议、SCI分区期刊&#xff0c;它们…

18 内核开发-内核重点数据结构学习

课程简介&#xff1a; Linux内核开发入门是一门旨在帮助学习者从最基本的知识开始学习Linux内核开发的入门课程。该课程旨在为对Linux内核开发感兴趣的初学者提供一个扎实的基础&#xff0c;让他们能够理解和参与到Linux内核的开发过程中。 课程特点&#xff1a; 1. 入门级别&…

Qt---day2-信号与槽

1、思维导图 2、 拖拽式 源文件 #include "mywidget.h" #include "ui_mywidget.h" MyWidget::MyWidget(QWidget *parent) : QWidget(parent) , ui(new Ui::MyWidget) { ui->setupUi(this); //按钮2 this->btn2new QPushButton("按钮2",th…

什么是多模态大模型,有了大模型,为什么还要多模态大模型?

随着人工智能技术的愈演愈烈&#xff0c;其技术可以说是日新月异&#xff0c;每隔一段时间就会有新的技术和理念被创造出来&#xff1b;而多模态大模型也是其中之一。 什么是多模态 想弄明白什么是多模态大模型&#xff0c;那么首先就要弄明白什么是多模态。 简单来说&#x…

【Git】Commit后进行事务回滚

起因 因为一直使用git add .&#xff0c;在学习pytorch中添加了一个较大的数据集后&#xff0c;导致git push失败&#xff0c;而这个大数据集并不是必须要上传到仓库的&#xff0c;但是因为自己在设置.gitignore前已经进行了git comit&#xff0c;所以&#xff0c;需要进行事务…

嵌入式linux学习第三天汇编语言点灯

嵌入式linux学习第三天汇编语言点灯 今天学习如何在linux板子上点灯。 I.MX6U GPIO 详解 我们发现I.MX6U GPIO是分为两类的&#xff0c;&#xff1a;SNVS 域的和通用的。在讨论i.MX6U或类似的复杂微处理器时&#xff0c;了解其GPIO&#xff08;通用输入输出&#xff09;引脚…

Windows环境编译 VVenC 源码生成 Visual Studio 工程

VVenC介绍 Fraunhofer通用视频编码器(VVenC)的开发是为了提供一种公开可用的、快速和有效的VVC编码器实现。VVenC软件基于VTM&#xff0c;其优化包括软件重新设计以减轻性能瓶颈、广泛的SIMD优化、改进的编码器搜索算法和基本的多线程支持以利用并行。此外&#xff0c;VVenC支…

深度学习之基于YOLOv5目标检测可视化系统

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景与意义 随着深度学习技术的快速发展&#xff0c;目标检测在多个领域中的应用日益广泛&#xff0c;包括…

125.两两交换链表中的节点(力扣)

题目描述 代码解决及思路 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(int x) : val(x), next(nullptr) {}* ListNode(int x, ListNode *next) : val(x), …

很快就可以试用Domino 15了

大家好&#xff0c;才是真的好。 前几天在比利时的安普卫特举办的Engage2024大会已经结束&#xff0c;流出的现场照片很多&#xff0c;主要是会议场地照片很多&#xff0c;说是令人震撼&#xff1b;可惜这次一手的PPT和会议内容不多.是的&#xff0c;本来我也是在等与会者写的…

VMware 虚拟机打开一段时间后卡死,VNX进程CPU占比高

一、问题描述 打开虚拟机后可以正常运行 运行几分钟后突然卡死 然后通过任务管理器可以观察到VMware Workstation VMX应用进程的CPU占比高&#xff0c;CPU也出现异常 关闭虚拟机重新开启&#xff0c;还是一样卡死 二、系统环境 系统: Windows10 VMware: Workstation 17 Pro …

如何提取视频二维码链接?二维码在线提取链接的方法

随着现在二维码用途的不断增多&#xff0c;很多不同的内容都可以生成二维码来展示&#xff0c;比如现在视频二维码就是比较常见的一种类型&#xff0c;一般用于产品介绍、教程演示、宣传推广等等。二维码的方式在某些情况下也有局限性&#xff0c;当无法扫码时就无法查看内容&a…

Linux信号捕捉

要处理信号&#xff0c; 我们进程就得知道自己是否收到了信号&#xff0c; 收到了哪些信号&#xff0c; 所以进程需要再合适的时候去查一查自己的pending位图 block 位图 和 hander表&#xff0c; 什么时候进行检测呢&#xff1f; 当我们的进程从内核态返回到用户态的时候&…

荷香堪筑梦,鸳鸯和月寻。(变相BFS搜索)

本题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 题目&#xff1a; 样例&#xff1a; 输入 3 4 2 .... ***. ..a. 输出 yes 思路&#xff1a; 根据题意&#xff0c;这里 1 s 可以移动多次&#xff0c;我们将每次可以移动避开雪的的位置存储起来&#xff0c;判断当…

springboot3常用注解使用

组键注册注解 组件注册步骤总结 条件注解 演示示例 属性绑定注解 ConfigurationProperties进行绑定 EnableConfigurationProperties进行绑定 其他常用注解 EnableAutoConfiguration ComponentScan RequestMapping GetMapping PostMapping Autowired Resource Servi…

js浏览器请求,post请求中的参数形式和form-data提交数据时数据格式问题(2024-05-06)

浏览器几种常见的post请求方式 Content-Type 属性规定在发送到服务器之前应该如何对表单数据进行编码。 默认表单数据会编码为 "application/x-www-form-urlencoded" post请求的参数一般放在Body里。 Content-Type&#xff08;内容类型&#xff09;&#xff0c;一般…