练习题(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://www.mzph.cn/diannao/7702.shtml

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

相关文章

c++ cpp 在类中执行线程 进行恒定计算

在编程中&#xff0c;顺序执行是常见的模式&#xff0c;但是对cpu的利用率不是很高&#xff0c;采用线程池&#xff0c;又太麻烦了&#xff0c;原因是还得不断地把任务拆分&#xff0c;扫描返回值。 如果 初始化n个类的时候&#xff0c;传递数据自身即可异步计算&#xff0c;那…

JavaWEB 框架安全:Spring 漏洞序列.(CVE-2022-22965)

什么叫 Spring 框架. Spring 框架是一个用于构建企业级应用程序的开源框架。它提供了一种全面的编程和配置模型&#xff0c;可以简化应用程序的开发过程。Spring 框架的核心特性包括依赖注入&#xff08;Dependency Injection&#xff09;、面向切面编程&#xff08;Aspect-Or…

AIGC绘画辅助网站

Midjourney风格样式 Midjourney Style Classifier | Andrei Kovalevs Midlibrary

124.反转链表(力扣)

题目描述 代码解决&#xff08;思路1&#xff1a;双指针&#xff09; class Solution { public:ListNode* reverseList(ListNode* head) {ListNode*temp;//保存cur下一个节点ListNode*curhead;ListNode*preNULL;while(cur){tempcur->next;// 保存一下 cur的下一个节点&#…

接口自动化测试的最佳实践和常见错误!

引言&#xff1a; 随着软件开发的不断演进&#xff0c;接口自动化测试在软件质量保障的过程中扮演着越来越重要的角色。良好的接口自动化测试可以提升测试效率、减少人力成本&#xff0c;但同时也存在着一些常见错误。本文将从零到一详细介绍接口自动化测试的最佳实践和常见错…

突破传统 重新定义:3D医学影像PACS系统源码(包含RIS放射信息)实现三维重建与还原

突破传统&#xff0c;重新定义PACS/RIS服务,洞察用户需求&#xff0c;关注应用场景&#xff0c;新一代PACS/RIS系统&#xff0c;系统顶层设计采用集中分布式架构&#xff0c;满足医院影像全流程业务运行,同时各模块均可独立部署&#xff0c;满足医院未来影像信息化扩展新需求、…

Ecovadis认证是什么?

Ecovadis认证是一种企业社会责任&#xff08;CSR&#xff09;评估和评级的认证&#xff0c;旨在衡量企业在环境、劳工和人权、道德以及可持续采购四个方面的可持续发展表现。该认证已成为全球范围内许多公司和组织的评估标准之一&#xff0c;有助于提高企业的会声誉和可持续发展…

Linux专栏10:Linux权限详解(上)

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Linux专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Linux权限详解&#xff08;上&#xff09; 编号&#xff1a;10 文章…

商务分析方法与工具(四):Python的趣味快捷-简单函数你真的会用吗?

Tips&#xff1a;"分享是快乐的源泉&#x1f4a7;&#xff0c;在我的博客里&#xff0c;不仅有知识的海洋&#x1f30a;&#xff0c;还有满满的正能量加持&#x1f4aa;&#xff0c;快来和我一起分享这份快乐吧&#x1f60a;&#xff01; 喜欢我的博客的话&#xff0c;记得…

SolidWorks进行热力学有限元分析一、模型建立

1.话不多说按照我的操作来 2.这一步鼠标移到中心点直接拉就行 3.这里选单位&#xff0c;继续按照操作来 4.选中这个边&#xff0c;直接拉&#xff0c;输入尺寸后确定&#xff0c;其他边同理 5.鼠标右键设置厚度 6.右键零件&#xff0c;然后编辑材料&#xff0c;给他赋予你需要的…

游戏辅助 -- 实战找人物对象基址

本节课在线学习视频&#xff1a; https://pan.quark.cn/s/3e83f4568031 一、打开CE工具&#xff0c;加载游戏进程 二、搜索人物血量144&#xff0c;选择首次扫描 三、进入游戏&#xff0c;让人物血量发生变化&#xff0c;搜索减少的数值 四、发现绿色的数值&#xff0c;一般绿…

Stable Diffusion:AI绘画的新纪元

摘要&#xff1a; Stable Diffusion&#xff08;SD&#xff09;作为AI绘画领域的新星&#xff0c;以其开源免费、强大的生成能力和高度的自定义性&#xff0c;正在引领一场艺术与技术的革命。本文旨在为读者提供Stable Diffusion的全面介绍&#xff0c;包括其原理、核心组件、安…

linux的信号量的使用

1.信号量 在多线程情况下&#xff0c;线程要进入关键代码就得获取信号量&#xff08;钥匙&#xff09;{sem_init(&sem, 0, 0);}&#xff0c;没有信号量的情况下就一直等待sem_wait(&sem)&#xff0c;只到别人把钥匙&#xff08;sem_post(&sem)&#xff09;给你。 …

分析错误ValueError: could not determine the shape of object type ‘Series‘

这个错误提示 ValueError: could not determine the shape of object type Series 通常发生在尝试将 pandas 的 Series 直接转换为 PyTorch 的 tensor 时&#xff0c;尤其是当 Series 的数据类型不明确或者包含非数值类型的数据时。为了修正这个问题&#xff0c;确保在转换之前…

如何做好一个活动策划?

活动策划的关键要素是什么&#xff1f; 首先&#xff0c;要明确一个概念:做活动就是走钢丝&#xff0c;没有保险的高空走钢丝!因为&#xff0c;活动没有“彩排”&#xff0c;只有现场"直播”! 无论什么类型的活动&#xff0c;人数是50人还是2000人&#xff0c;也不论预算…

预定类小程序源码搭建包含各行业+源码开源可二开+详细图文搭建部署教程

在数字化浪潮席卷的今天&#xff0c;各行各业都急需找到与顾客连接的新方式。为了满足这一需求&#xff0c;很多店铺和企业都推出了预定类小程序&#xff0c;分享一款开源版预订类小程序源码&#xff0c;一站式解决方案&#xff0c;覆盖餐饮、旅游、美容、医疗、教育等多个行业…

java--GUI

目录 GUI&#xff08;Graphical User Interface&#xff09; swing 窗口(JFrame) 面板(JPanel) 流水布局(FlowLayout) 边界布局(BorderLayout) ​编辑 网格布局(GridLayout) 按钮(JButton) 标签组件&#xff0c;用来设置文字(JLabel) 单行文本框组件(JTextField) 多…

使用Java编写的简单彩票中奖概率计算器

前言 在当今社会&#xff0c;彩票已经成为许多人追逐梦想和改变生活的一种方式。然而&#xff0c;中奖的概率却是一个让人犹豫和兴奋的话题。在这篇文章中&#xff0c;我们将探讨如何使用Java编程语言实现一个简单的彩票中奖概率计算器。通过这个计算器&#xff0c;我们可以根…

【星海随笔】windows 上跑MySQL

step one 使用 WSL 在 Windows 上安装 Linux wsl官方文档 在管理员模式下打开 PowerShell windows上安装wsl wsl --install查看哪些是可用的 wsl --list --onlineC:\Windows\System32\drivers\hosts docker-desktop下载官网&#xff1a;Install Docker Desktop on Windows …

关于执行CLAM的代码的一些需要记录的点

文章链接&#xff1a;[2004.09666] Data Efficient and Weakly Supervised Computational Pathology on Whole Slide Images (arxiv.org) 代码链接&#xff1a;GitHub - mahmoodlab/CLAM: Data-efficient and weakly supervised computational pathology on whole slide images…