2016校招真题-小米Git(找最近双亲)
来源:互联网 发布:vps建站 编辑:程序博客网 时间:2024/05/21 10:42
问题:找最近双亲问题 思想:找到indexA到0(根节点)的路径如:4->5->2->0 ; 再找到indexB到0(根节点)的路径如:1->2->0;找到两个路径后,从后往前,找到第一个两个路径不同的结点5与1,那么后一个结点2就是最近分割点。(其中:找路径用递归来解决,用一个visited数组记录结点是否被访问过,结束条件是:这个结点为0(根节点);)
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){ vector<bool> visited(matrix.size(),false); vector<int> path(matrix.size(),-1); queue<int> qu; qu.push(0); while(!qu.empty()){ int now=qu.front(); qu.pop(); visited[now]=true; for(int i=0;i<matrix.size();i++){ if(matrix[now][i]=='1'&&visited[i]==false){ path[i]=now; qu.push(i); } } } stack<int> pathA; stack<int> pathB; while(indexA!=0){ pathA.push(indexA); indexA=path[indexA]; } pathA.push(0); while(indexB!=0){ pathB.push(indexB); indexB=path[indexB]; } pathB.push(0); int re; while(!pathA.empty()&&!pathB.empty()&&pathA.top()==pathB.top()){ re=pathA.top(); pathA.pop(); pathB.pop(); } return re; }};
(1)path数组用来记录每个节点的双亲,由于双亲是唯一的,所以可以用栈记录从indexA到root节点(0)路径所经过的所有节点。
(2)visited数组用来标记已经访问过的结点,因为matrix表示的结点是双向的,但树是单向的,我们只需要找出当前访问结点所有的子结点,并在path数组标记,同时这些子结点被push到pu队列,进行下一步的访问。
(3)pu队列用来存入子结点等待被访问,matrix是按层序遍历的。
0 0
- 2016校招真题-小米Git(找最近双亲)
- 2016小米-小米Git-Java
- 最近使用Git,找些资料
- 牛客网---2016---小米Git
- 小米 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米Git
- 小米笔试题-小米Git
- 最近在找房子
- 找最近的素数
- 如何找到二叉树两个节点的最近公共双亲?
- 算法题-小米Git
- java多线程(1):线程的创建和多线程的安全问题
- Android项目中管理activity(项目活动管理器)
- ABOUT NETWORK CONVERGENCE
- java文件写入
- java线程
- 2016校招真题-小米Git(找最近双亲)
- springboot入门
- 164.n1-菜单详情页的tab的初始化(网络取数据)
- hdu-2670(dp)
- HDU1009 不明错误
- Neutron总结-iptables基础操作之查看操作
- js引用<select>下拉列表选定的内容
- Scala里面的break
- Android-drawable