力扣labuladong——一刷day41

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、力扣236. 二叉树的最近公共祖先
  • 二、力扣1676. 二叉树的最近公共祖先 IV
  • 三、力扣1644. 二叉树的最近公共祖先 II
  • 四、力扣235. 二叉搜索树的最近公共祖先
  • 五、力扣1650. 二叉树的最近公共祖先 III


前言


如果说笔试的时候经常遇到各种动归回溯这类稍有难度的题目,那么面试会倾向于一些比较经典的问题,难度不算大,而且也比较实用。 本文就用 Git 引出一个经典的算法问题:最近公共祖先(Lowest Common Ancestor,简称 LCA)。 git pull 这个命令我们经常会用,它默认是使用 merge 方式将远端别人的修改拉到本地;如果带上参数 git pull -r,就会使用 rebase 的方式将远端修改拉到本地。 这二者最直观的区别就是:merge 方式合并的分支会看到很多「分叉」,而 rebase 方式合并的分支就是一条直线。但无论哪种方式,如果存在冲突,Git 都会检测出来并让你手动解决冲突。 那么问题来了,Git 是如何检测两条分支是否存在冲突的呢?

一、力扣236. 二叉树的最近公共祖先

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {return fun(root,p.val,q.val);}public TreeNode fun(TreeNode root ,int val1, int val2){if(root == null){return null;}if(root.val == val1 || root.val == val2){return root;}TreeNode lchild = fun(root.left, val1, val2);TreeNode rchild = fun(root.right, val1, val2);if(lchild != null && rchild != null){return root;}return lchild != null ? lchild : rchild;}
}

二、力扣1676. 二叉树的最近公共祖先 IV

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode[] nodes) {if(root == null){return null;}for(TreeNode n : nodes){if(root == n){return root;}}TreeNode lchild = lowestCommonAncestor(root.left,nodes);TreeNode rchild = lowestCommonAncestor(root.right,nodes);if(lchild != null && rchild != null){return root;}return lchild != null ? lchild : rchild;}
}

三、力扣1644. 二叉树的最近公共祖先 II

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/
class Solution {boolean flagL = false, flagR = false;public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {TreeNode res = fun(root,p,q);if(flagL && flagR){return res;}return null;}public TreeNode fun(TreeNode root, TreeNode p, TreeNode q){if(root == null){return null;}TreeNode lchild = fun(root.left,p,q);TreeNode rchild = fun(root.right, p, q);if(lchild != null && rchild != null){return root;}if(root == p || root == q){if(root == p){flagL = true;return root;}if(root == q){flagR = true;return root;}}return lchild != null ? lchild : rchild; }
}

四、力扣235. 二叉搜索树的最近公共祖先

/*** Definition for a binary tree node.* public class TreeNode {*     int val;*     TreeNode left;*     TreeNode right;*     TreeNode(int x) { val = x; }* }*/class Solution {public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {if(root.val > p.val && root.val > q.val){return lowestCommonAncestor(root.left,p,q);}else if(root.val < p.val &&root.val < q.val){return lowestCommonAncestor(root.right,p,q);}else{return root;}}
}

五、力扣1650. 二叉树的最近公共祖先 III

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node parent;
};
*/class Solution {public Node lowestCommonAncestor(Node p, Node q) {while(fun(p,q) == null){p = p.parent;}return p;}public Node fun(Node p, Node q){if(p == null){return null;}if(p == q){return p;}Node l = fun(p.left,q);Node r = fun(p.right,q);if(l != null){return l;}if(r != null){return r;}return null;}
}

链表寻找共同节点操作

/*
// Definition for a Node.
class Node {public int val;public Node left;public Node right;public Node parent;
};
*/class Solution {public Node lowestCommonAncestor(Node p, Node q) {Node a = p, b = q;while(a != b){if(a == null) a = q;else a = a.parent;if(b == null) b = p;else b = b.parent;}return a;}
}

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

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

相关文章

Spring Boot接口设计规范

接口参数处理及统一结果响应 1、接口参数处理 1、普通参数接收 这种参数接收方式是比较常见的&#xff0c;由于是GET请求方式&#xff0c;所以在传参时直接在路径后拼接参数和参数值即可。 例如&#xff1a;localhost:8080/api/product/list?key1value1&key2value2 /…

Golang起步篇(Windows、Linux、mac三种系统安装配置go环境以及IDE推荐以及入门语法详细释义)

Golang起步篇 Golang起步篇一. 安装Go语言开发环境1. Wondows下搭建Go开发环境(1). 下载SDK工具包(2). 解压下载的压缩包&#xff0c;放到特定的目录下&#xff0c;我一般放在d:/programs下(路径不能有中文或者特殊符号如空格等)(3). 配置环境变量步骤1&#xff1a;先打开环境变…

事关Django的静态资源目录设置(Django的setting.py中的三句静态资源(static)目录设置语句分别是什么作用?)

在Django的setting.py中常见的三句静态资源(static)目录设置语句如下&#xff1a; STATICFILES_DIRS [os.path.join(BASE_DIR, static)] STATIC_ROOT os.path.join(BASE_DIR, static) STATIC_URL /static/下面介绍这三句话的作用。 首先说第1句和第2句&#xff1a; STATI…

数据结构【DS】特殊二叉树

完全二叉树 叶子结点只能出现在最下层和次下层, 最下层的叶子结点集中在树的左部完全二叉树中, 度为1的节点数 0个或者1个【计算时可以用这个快速计算, 配合&#x1d45b;0&#x1d45b;21】若n为奇数&#xff0c;则分支节点每个都有左右孩子&#xff1b;若n为偶数&#xff0…

【STM32】ADC(模拟/数字转换)

一、ADC的简介 1.什么是ADC 1&#xff09;将【电信号】-->【电压】-->【数字量】 2&#xff09;ADC可以将引脚上连续变化的模拟电压转换为内存中存储的数字量&#xff0c;建立模拟电路到数字电路的桥梁。 3&#xff09;12位逐次逼近型ADC&#xff0c;1us转换时间&#xf…

六大排序(插入排序、希尔排序、冒泡排序、选择排序、堆排序、快速排序)未完

文章目录 排序一、 排序的概念1.排序&#xff1a;2.稳定性&#xff1a;3.内部排序&#xff1a;4.外部排序&#xff1a; 二、插入排序1.直接插入排序2.希尔排序 三、选择排序1.直接选择排序方法一方法二直接插入排序和直接排序的区别 2.堆排序 四、交换排序1.冒泡排序2.快速排序…

“新KG”视点 | 知识图谱与大语言模型协同模式探究

OpenKG 大模型专辑 导读 知识图谱和大型语言模型都是用来表示和处理知识的手段。大模型补足了理解语言的能力&#xff0c;知识图谱则丰富了表示知识的方式&#xff0c;两者的深度结合必将为人工智能提供更为全面、可靠、可控的知识处理方法。在这一背景下&#xff0c;OpenKG组织…

【python基础】类详解:如何编写类、__init__()、修改实例属性、类存储到模块并导入、py标准库、编写类的约定

文章目录 一. 创建和使用类1. 创建Dog类1.1. 构造方法&#xff1a;1.2. 形参self&#xff08;类比java的this&#xff09;&#xff1a;1.3. 属性&#xff08;类比java的成员变量&#xff09;&#xff1a; 2. 根据类创建实例2.1. 创建实例2.2. 访问属性2.3. 调用方法2.4. 创建多…

栈和队列概念

栈stack 栈只能在一端插入/删除元素先入后出只能从栈顶插入&#xff0c;栈顶删除栈底不允许插入和删除push&#xff1a;进栈pop&#xff1a;出栈应用场景&#xff1a; 队列 Queue 队列的插入操作称为 “入队”&#xff08;Enqueue&#xff09;&#xff0c;是在队尾进行的&am…

数字IC前端学习笔记:异步复位,同步释放

相关阅读 数字IC前端https://blog.csdn.net/weixin_45791458/category_12173698.html?spm1001.2014.3001.5482 异步复位 异步复位是一种常见的复位方式&#xff0c;可以使电路进入一个可知的状态。但是不正确地使用异步复位会导致出现意想不到的错误&#xff0c;复位释放便是…

读像火箭科学家一样思考笔记03_第一性原理(上)

1. 思维的两种障碍 1.1. 为什么知识会成为一种缺陷而非一种美德 1.1.1. 知识是一种美德 1.1.2. 知识同样的特质也会把它变成一种缺点 1.1.3. 知识确实是个好东西&#xff0c;但知识的作用应该是给人们提供信息&#xff0c;而不是起约束作用 1.1.4. 知识应该启发智慧&#…

UOS统信操作系统QIcon::fromTheme详解

内置图标引擎 前言 一般Qt应用开发中设置图标只需要知道icon name就可以使用, 图标引擎会自动去存放图标主题的目录下查找。一般主题目录下存放的够用,如果还是无法满足需求,可以使用内嵌资源,使用qt的资源系统。 内嵌资源也可以像使用主题中的图标一样,它是由插件buildi…

新版JetBrains ToolBox【Windows】修改应用安装位置

WIndows下新版的JetBrainse ToolBox 无法修改应用安装路径 关闭 ToolBox 应用修改配置文件.settings.json 路径&#xff1a;C:\Users\用户名\AppData\Local\JetBrains\Toolbox "install_location": "xxx",

机器学习笔记 - 了解常见开源文本识别数据集以及了解如何创建用于文本识别的合成数据

一、部分开源数据集 以下是一些英文可用的开源文本识别数据集。 ICDAR 数据集:ICDAR 代表国际文档分析和识别会议。该活动每两年举行一次。他们带来了一系列塑造了研究社区的场景文本数据集。例如, ICDAR-2013和ICDAR-2015数据集。 MJSynth 数据集:该合成词数据集由牛津大…

多线程概述

文章目录 线程是什么线程有什么作用线程和进程的区别多线程相较于进程优势 在Java这个圈子中,多进程用的并不多,因为进程是一个重量级操作,进程是资源分配的基本单位,申请资源是一个比较消耗时间的操作. 线程是什么 线程是一个独立的执行流,可以被独立调度到CPU上执行 线程是…

计算机毕业设计选题推荐-个人健康微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT研究室✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Python…

腾讯微服务平台TSF学习笔记(一)--如何使用TSF的Sidecar过滤器实现mesh应用的故障注入

Mesh应用的故障注入 故障注入前世今生Envoy设置故障注入-延迟类型设置故障注入-延迟类型并带有自定义状态码总结 故障注入前世今生 故障注入是一种系统测试方法&#xff0c;通过引入故障来找到系统的bug&#xff0c;验证系统的稳健性。istio支持延迟故障注入和异常故障注入。 …

C++二分查找算法:找到 Alice 和 Bob 可以相遇的建筑

本文涉及的基础知识点 二分查找算法合集 离线查询 题目 给你一个下标从 0 开始的正整数数组 heights &#xff0c;其中 heights[i] 表示第 i 栋建筑的高度。 如果一个人在建筑 i &#xff0c;且存在 i < j 的建筑 j 满足 heights[i] < heights[j] &#xff0c;那么这个…

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…

linux mount命令加速

一般远程mount 的用法如下&#xff1a; #mount 远程ip:远程目录 本地目录 //如果本地目录不存在需要创建 mount 192.168.110.111:/home/caixxx /home/cym 但是该命令默认使用的协议是nfs4&#xff0c;这个协议如果读写块大小参数设置的不合适&#xff0c;mount后读取远程目…