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是一个开源的分布式版本控制系统,用以有效.高速的处理从很小到非常 ...
随机推荐
- 2721: [Violet 5]樱花
2721: [Violet 5]樱花 Time Limit: 5 Sec Memory Limit: 128 MBSubmit: 547 Solved: 322[Submit][Status][D ...
- linux中的vi编辑器(一)
1.在linux中如果两个用户都在打开一个文件进行编辑,那么文件最后将以最后保存的版本为主. 2.vi仅仅是一个文本编辑器,相当于windows中的记事本,vi的工作模式, 命令模式:在该模式下,在键 ...
- python的特殊方法总结
1.跟运算相关的特殊方法 2.跟运算符相关的方法
- CodeChef February Challenge 2018 Points Inside A Polygon (鸽笼原理)
题目链接 Points Inside A Polygon 题意 给定一个$n$个点的凸多边形,求出$[ \frac{n}{10}]\ $个凸多边形内的整点. 把$n$个点分成$4$类: 横坐标奇, ...
- Oracle并发控制、事务管理学习笔记
(a)基本概念 锁的2种最基本.最简单的类型:排他锁(eXclusive lock,即X锁).共享锁(Share lock,即S锁). 不同级别的锁定协议及其作用: 申请的锁 及其作用 锁定协议 修改 ...
- Delphi Integer 转成单字节
整形不能超过256 b:=Byte(StrToInt(n)); var s: string; b: Byte; begin s := Edit1.Text; b := Byte(Str ...
- Flutter开发记录part1
(1)AppBar:automaticallyImplyLeading//是否带返回leading箭头 (2)非route路由页面跳转 :Navigator.of(context).push(Mate ...
- ylb:SQL 表的高级查询-多表连接和子查询
ylbtech-SQL Server: SQL Server-表的高级查询-多表连接和子查询 SQL Server 表的高级查询-多表连接和子查询. 1,ylb:表的高级查询-多表连接和子查询 返回顶 ...
- LCD设备驱动程序
LCD是Liquid Crystal Display的简称,也就是经常所说的液晶显示器 LCD能够支持彩色图像的显示和视频的播放,是一种非常重要的输出设备 Framebuffer 是Linux系统 ...
- antialiasing
Aliasing发生的原因在于,采样频率过低, 这样就无法重建更接近原来texture的图像, Temporal aliasing在时域上 采的texture 次数太少 不能重建真实 是帧与帧之间,s ...