首页 > 编程语言 >算法题-最近公共祖先

算法题-最近公共祖先

时间:2024-01-31 18:44:38浏览次数:37  
标签:node 祖先 indexA father depth int 算法 公共 节点

目录

小米 Git

题目描述

Git 是一个常用的分布式代码管理工具,Git 通过树的形式记录文件的更改历史(例如示例图),树上的每个节点表示一个版本分支,工程师经常需要找到两个分支的最近的分割点。

给定一个用邻接矩阵 matrix 表示的树,请你找到版本 versionA 和 versionB 最近的分割点并返回编号。

注意: 1.矩阵中从第一行 (视为节点 0 )开始,表示与其他每个点的连接情况,例如 [01011,10100,01000,10000,10000] 表示节点 0 与节点 1 , 3 , 4 相连,节点 1 与节点 0 , 2 相连,其他点的以此类推。

2.并不保证是一棵二叉树,即一个节点有可能有多个后继节点,我们把节点 0 视为树的根节点。

数据范围:树上节点数量满足 1≤n≤100

  • 示例 1
    输入
    ["01011","10100","01000","10000","10000"],1,2
    输出
    1
  • 示例 2
    输入
    ["0"],0,0
    输出
    0

思路

求最近公共祖先,先是把输入转换成一个树形结构,用字典存储:

然后使用深度优先递归查找目标节点,把经过的路径以列表记录下来。

然后两个节点的路径对比,找到最后的相同元素即为最近的公共祖先。

py

class Solution:
    def Git(self, matrix: List[str], versionA: int, versionB: int) -> int:

        global alist, blist
        alist = []  # 用来保存a的路径
        blist = []  # 用来保存b的路径
        tree = {}
        for i in range(len(matrix)):  # 整理为字典,树形结构
            tree[i] = []
            relation = list(matrix[i])
            index = 0
            while len(relation) > 0:
                r = relation.pop(0)
                if r == "1":
                    tree[i].append(index)
                index += 1

        def walk(tmplist, pre, node):
            tmplist.append(node)
            if node == versionA:  # 找到a,保存路径
                global alist
                alist = tmplist.copy()
            if node == versionB:  # 找到b,保存路径,注意这里a和b可能是同一个值,所以不要用else
                global blist
                blist = tmplist.copy()
            for i in tree[node]:  # 遍历执行下级节点
                if i == pre:  # 注意跳过来时的节点
                    continue
                walk(tmplist, node, i)
                tmplist.pop()

        walk([], 0, 0)
        res = 0
        while len(alist) > 0 and len(blist) > 0:  # 逐个弹出首位比较,直到不相同或者路径为空
            a = alist.pop(0)
            b = blist.pop(0)
            if a == b:
                res = a
            else:
                break
        return res

java

import java.util.*;


public class Solution {

    public void dfs(int node, int father, int dep, int[] path, int[] depth,String[] mat) {
        depth[node] = dep;
        path[node] = father;
        for (int i = 0; i < mat.length; i++) {
            if (i != father && mat[node].charAt(i)=='1') {
                dfs(i,node,dep+1,path,depth,mat);
            }
        }
    }
    public int Git(String[] matrix, int indexA, int indexB) {
        int n  = matrix.length;
        int[] depth = new int[n];
        int[] father = new int[n];
        father[0] = -1;
        dfs(0,-1,0,father,depth,matrix);
        while (depth[indexA] > depth[indexB]) {
            indexA = father[indexA];
        }
        while (depth[indexB] > depth[indexA]) {
            indexB = father[indexB];
        }
        while (indexA != indexB) {
            indexA = father[indexA];
            indexB = father[indexB];
        }
        return indexA;
    }
}

标签:node,祖先,indexA,father,depth,int,算法,公共,节点
From: https://www.cnblogs.com/aijisjtu/p/17999912

相关文章

  • 差分算法
    差分算法差分算法可以用来维护区间的加减我们假定有一个数组\(a={1,2,3,4}\)\(b\)为数组\(a\)的差分数组。\[b_i=\begin{cases}a_i-a_{i-1}&i\in[2,n]\\a_1&i=1\end{cases}\]根据给定的数组\(a={1,2,3,4}\)我们很容易得知数组\(b={1,1,1,1}\)我......
  • TSINGSEE青犀智能分析网关V4如何利用AI智能算法保障安全生产、监管,掀开安全管理新篇章
    旭帆科技的智能分析网关V4内含近40种智能分析算法,包括人体、车辆、消防、环境卫生、异常检测等等,在消防安全、生产安全、行为检测等场景应用十分广泛。如常见的智慧工地、智慧校园、智慧景区、智慧城管等等,还支持抓拍、记录、告警、语音对讲、平台级联等功能。算法稳定。识别高效,......
  • 【算法】枚举
    枚举枚举的思想是不断地猜测,从可能的集合中一一尝试,然后再判断题目的条件是否成立。但是并非所有的情况都要枚举,有时要适当的进行一些剪枝。(如枚举\(a+b=c\)且\(b>a\)的个数那么\(b\)要从\(a+1\)开始枚举)。通常来说,我们可以限定枚举的范围让它的复杂度更高。虽......
  • 基于文本环境下的强化学习算法:文本游戏环境下的强化学习的一些思考?文本比图像的抽象度
    这里说一个个人的思考,那就是:文本比图像的抽象度更高,或许基于文本的强化学习算法更加强大。基于文本环境的强化学习算法一直被认为是比较小众的一个场景,一般认为文本的AI处理能力是不如图片的,尤其文本对事物描述的能力是十分有限的,但是随着ChatGPT-3.5的大火,或许这个状况得到了......
  • 【算法】斯坦纳树
    参考资料OI-Wiki:斯坦纳树T_a_r_j_a_n:[图论]-------斯坦纳树编程客:集合枚举子集-学习笔记概念斯坦纳树原本是在一个几何图中提出来的问题。在一个平面内给出\(n\)个点\(p_i\),可以加入一些新的点(称为斯坦纳点),要求在使得这些点连通并且边的总长度最小。在OI中,斯坦......
  • 算法模板 v1.6.1.20240131
    算法模板v1.1.1.20240115:之前的历史版本已经不可寻,创建了第一份算法模板。v1.2.1.20240116:删除“编译”-“手动开栈”与“编译”-“手动开O优化”;将“编译”-“CF模板”中的第20行代码cin>>T;注释;删除“读写”及其目录下的内容;删除“图论”-“欧拉图”-“混合图”;删除“图论”-......
  • MD5算法:高效安全的数据完整性保障
    摘要:在数字世界中,确保数据完整性和安全性至关重要。消息摘要算法就是一种用于实现这一目标的常用技术。其中,MessageDigestAlgorithm5(MD5)算法因其高效性和安全性而受到广泛关注。本文将详细介绍MD5算法的优缺点,以及它如何解决数据完整性问题和安全性问题。此外,我们还将提供......
  • 深入浅出堆排序: 高效算法背后的原理与性能
    ......
  • 快速排序:高效分割与递归,排序领域的王者算法
    ......
  • 读论文-基于自注意力机制和迁移学习的跨领域推荐算法
    前言今日要读的文章为一篇2022年4月2日发表于《计算机科学》的期刊文章;文章发现了传统的单领域推荐算法的问题:传统的单领域推荐算法受限于用户和项目的稀疏关系,存在用户/项目冷启动的问题,并且,其仅以用户对项目评分进行建模,忽略了评论文本中所蕴含的信息。基于此,文章提出了一种基......