小米Git

来源:互联网 发布:如何查询域名的有效期 编辑:程序博客网 时间:2024/06/10 12:04

git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base’<–base<–A<–A’ ^ | — B<–B’ 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符’0’或’1’组成,长度为n。matrix[i][j]==’1’当且仅当git树种第i个和第j个节点有连接。节点0为git树的根节点。)

题目意思:
找最近双亲问题 思想:找到indexA到0(根节点)的路径如:4->5->2->0 ; 再找到indexB到0(根节点)的路径如:1->2->0;找到两个路径后,从后往前,找到第一个两个路径不同的结点5与1,那么后一个结点2就是最近分割点。(其中:找路径用递归来解决,用一个visited数组记录结点是否被访问过,结束条件是:这个结点为0(根节点);)

结题思路:
多叉树寻找最近公共父节点问题
解题思路

从矩阵构造出father数组,father数组保存每个节点的父节点。
记录从根节点到带求节点A和B的路径。
比较路径,找到最近的公共节点。

技巧

由于矩阵给的双向关系,构造father数组时,需要从根节点0开始,从上层往下层构造。
用双向队列记录根节点到本节点的路径,双向队列可以往对头加节点,也可以从对头取节点。

class Solution{public:    int getSplitNode(vector<string> matrix, int indexA, int indexB)    {        queue<int> que;        que.push(0);        vector<int> father(matrix.size(), -1);        vector<bool> flag(matrix.size(), false);        flag[0] = true;        while (!que.empty())        {            int i = que.front();            que.pop();            for (int j = 0; j < matrix.size(); j++)            {                if (matrix[i][j] == '1' && !flag[j])                {                    que.push(j);                    //数组保存的父节点 ,j的父节点是i                    father[j] = i;                    flag[j] = true;                }            }        }        int pa = indexA;        int pb = indexB;        deque<int> pathA;        deque<int> pathB;        while (pa!=-1)        {            pathA.push_front(pa);            pa = father[pa];        }        while (pb != -1)        {            pathB.push_front(pb);            pb = father[pb];        }        int common=0;        while (!pathA.empty() && !pathB.empty() &&pathA.front()==pathB.front())        {            common = pathA.front();            pathA.pop_front();            pathB.pop_front();        }        return common;    }};
原创粉丝点击