git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0
// ConsoleApplication10.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
/**
* 返回git树上两点的最近分割点
*
* @param matrix 接邻矩阵,表示git树,matrix[i][j] == '1' 当且仅当git树中第i个和第j个节点有连接,节点0为git树的跟节点
* @param indexA 节点A的index
* @param indexB 节点B的index
* @return 整型
*/
int getSplitNode(vector<string> matrix, int indexA, int indexB) {
if (indexA >= matrix.size() || indexB >= matrix.size())
{
return 0;
}
vector<int> depth;
vector<int> parent;
breadTraverl(matrix, depth, parent);
int p=0;
//如果同一深度,父节点相同,则分割点为父节点
//同一深度,父节点不同,寻找父节点的父节点
//不同深度,从深度高的往上过滤,每次过滤的时候判断是否达到低的节点的深度;没有之前,要判断低的节点是否是深的节点的父节点
if (depth[indexA] == depth[indexB])
{
int a = indexA;
int b = indexB;
while (parent[a]!=parent[b])
{
a = parent[a];
b = parent[b];
}
p= parent[a];
}
else {
int a = indexA;//a对应的节点深
int b = indexB;
bool flag = false;//未找到分割点
if (depth[indexA] < depth[indexB])
{
a = indexB;
b = indexA;
}
while (depth[a]!=depth[b])//当节点a和节点b不在同一个深度
{
if (parent[a] == b)
{
p = b;
flag = true;
break;
}
else
{
--a;
}
}
if (flag == false)
{
int a = indexA;
int b = indexB;
while (parent[a] != parent[b])
{
a = parent[a];
b = parent[b];
}
p = parent[a];
}
}
return p;
}
//广度优先遍历图
void breadTraverl(vector<string> matrix, vector<int> &depth, vector<int> &parent)
{
//visited数组,如何visited[i]为false,则被访问过
vector<bool> visited;
// vector<int> depth;
// vector<int> parent;
for (int i = 0;i < matrix.size();++i)
{
visited.push_back(true);
depth.push_back(0);
parent.push_back(0);
}
cout << "V_" << 0 << " ";
visited[0] = false;
depth[0] = 0;
parent[0] = 0;//根节点的本身设置为自己
for (int i = 0;i < matrix.size();++i)
{
// cout << "matrix[0].length():" << matrix[0].length() << endl;
for (int j = 0;j < matrix[0].length();++j)
{
//注意:此处的matrix[i][j]应该为'1'而不是1
if ((matrix[i][j] == '1')&& (visited[j] == true))
{
cout << "matrix[" << i << "]"<<"["<<j<<"]:" << matrix[i][j] << " ";
cout << "visited["<<j<<"]:" << visited[j] << endl;
cout << "V_" << j << " ";
parent[j] = i;
depth[j] = depth[i] + 1;
visited[j] = false;
}
}
}
cout << endl;
for (int i = 0;i < matrix.size();i++)
{
cout << i << ":";
cout << "parent:" << parent[i] << " ";
cout << "depth:" << depth[i] << endl;
}
}
};
int main()
{
Solution so;
vector<string> matrix;
string str1 = "01011";
string str2 = "10100";
string str3 = "01000";
string str4 = "10000";
string str5 = "10000";
matrix.push_back(str1);
matrix.push_back(str2);
matrix.push_back(str3);
matrix.push_back(str4);
matrix.push_back(str5);
cout<<"结果:"<<so.getSplitNode(matrix, 0, 2);
cout << endl;
return 0;
}
git是一种分布式代码管理工具,git通过树的形式记录文件的更改历史,比如: base'<--base<--A<--A' ^ | --- B<--B' 小米工程师常常需要寻找两个分支最近的分割点,即base.假设git 树是多叉树,请实现一个算法,计算git树上任意两点的最近分割点。 (假设git树节点数为n,用邻接矩阵的形式表示git树:字符串数组matrix包含n个字符串,每个字符串由字符'0的更多相关文章
- 关于分布式代码管理工具git
一.安装 Step1 进入官网https://www.git-scm.com/download/下载,然后安装,一直“下一步”即可 Step2 验证是否安装成功,在任意地方右键,菜单中含有Git ...
- 代码管理工具 (含git、npm、gulp)
1 Git 分布式代码管理工具(基于Linux,可在本地进行提交)代码同时储存在本地和服务器中 ① Git基本操作命令 (1)初始化,创建初始化仓库 git init ------- 文件初始化,初始 ...
- 代码管理工具 Git
之前一直使用微软的代码管理工具TFS(Team Foundation Server)..NET CORE 2.0的发布后,考虑到.NET CORE项目可以跨平台,准备把项目迁移到.NET CORE 环 ...
- 代码管理工具-Git基础介绍及常用技巧
目录 Git起源 基本概念 Branch.HEAD和Commit tree Git分支 git merge 和 git rebase 的区别和抉择 与远程仓库的交互 关于一些实际开发场景的问题和解决方 ...
- 代码管理工具 --- git的学习笔记二《git的工作原理》
通过几个问题来学习代码管理工具之git 一.git是什么?为什么要用它?使用它的好处?它与svn的区别,在Mac上,比较好用的git图形界面客户端有 git 是分布式的代码管理工具,使用它是因为,它便 ...
- Git代码管理工具
Git代码管理工具 Git 是分布式的源代码管理工具,这点区别于svn -让源代码可以被追溯,主要是记录了每次的更新了什么,如果新版本不想用,那么则可以退回之前的版本 -Git 是Linux之父当年为 ...
- 代码管理工具之git的学习
1.代码管理工具git的学习 http://www.ruanyifeng.com/blog/2015/12/git-cheat-sheet.html 2.github的使用帮助 https:// ...
- 通过代码管理工具 git 完成一次完整的代码管理过程
1.从公共远程fork一份自己的本地远程之后,从本地远程 clone 到本地 2.将本地代码跟公共远程代码做关联配置 git remote add upstream https://github.co ...
- GIT: 分布式开发 代码管理工具使用命令大全
代码管理工具: GIT 什么是GIT? Git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目 Git是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
随机推荐
- 为图片添加文字 canvas
<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...
- Docker(八):私有仓库
有时候使用Docker Hub这样的公共仓库可能不太方便,用户可以创建一个本地仓库供私人使用. 在安装了Docker之后,可以获取官方的registry镜像来运行,docker-registry是官方 ...
- 处理printf的变参问题
VA_LIST 是在C语言中解决变参问题的一组宏,所在头文件:#include <stdarg.h> (1)首先在函数里定义一具VA_LIST型的变量,这个变量是指向参数的指针: (2)然 ...
- hdu 2145(迪杰斯特拉)
zz's Mysterious Present Time Limit: 10000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java ...
- sprak 环境搭建的坑
1,/etc/hosts下的ip master/slave 的对照 /etc/sysconfig/network 配置: NETWORKING=yes HOSTNAME=master 以及spark/ ...
- Cygwin下vi和vim方向键和Backspace不好用的问题(转)
执行p4 client时vi打开文本,编辑起来恼火,于是找到了这个: 默认的vi(vim)没有配置文件,因此导致了方向键出现ABCD,以及Backspace只会移动光标,字符不消失的问题.cygwin ...
- QQ聊天窗口上的广告与QQ弹窗广告的完美屏蔽去除
涉及的软件 1. QQ (笔者的为v8.2版本) 2. Win7 3. ADSafe(3.13.308.9900正式版) 前言 QQ广告十分讨人厌,除了QQ弹窗的广告,让人十分反感外,最近发现QQ聊 ...
- pt-online-schema-change原理解析(转)
pt-online-schema-change原理解析 博客相关需要阅读 - zengkefu - 博客园 .pt-online-schema-change工具的使用限制: ).如果修改表有外键,除非 ...
- Using Blocks in iOS 4: The Basics
iOS 4 introduces one new feature that will fundamentally change the way you program in general: bloc ...
- New Ubuntu 16.04 Server Checklist
新的云服务器需要进行一些配置和安装一些软件,推荐Digitalocean社区的一些教程 服务器配置(包括SSH,安全设置):https://www.digitalocean.com/community ...