題目描述:
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樹的根節點。)
輸入例子:
[01011,10100,01000,10000,10000],1,2
輸出例子:1
思路:
將輸入例子的鄰接矩陣畫成圖,畫的比較丑,大家將就着看吧。
0<-1<-2
<-3
<-4
結合題目描述,得出關鍵信息兩點。
1、1節點和2節點的分割點是1->0和2->1->0兩條路徑的第一個重合點。可以將此題轉化為求兩條有序鏈表的公共節點。
2、路徑上的節點值一定是單調遞減的。
所以我們可以從值較大的節點B出發,依次前往父節點B‘(有且僅有一個,根節點沒有),每到達一個父節點就和另一個節點值A進行比較,如果相等,說明找到了分割點,如果B'小於A,則停止當前路徑,從A繼續出發找父節點。
關於父節點的尋找:設B所在行rowB,從matrix[rowB][rowB-1]開始向左遍歷,遇到的第一個1就是父節點的編號。
1 public int getSplitNode(String[] matrix, int indexA, int indexB) { 2 if (indexA < 0 || indexB < 0 || matrix == null) 3 return -1; 4 if (indexA == indexB) 5 return indexA; 6 if (indexA < indexB) { 7 for (int i = indexB - 1; i >= 0; i--) { 8 if(matrix[indexB].charAt(i) == '1') { 9 return getSplitNode(matrix, indexA, i); 10 } 11 } 12 } 13 return getSplitNode(matrix, indexB, indexA); 14 }
PS:代碼並沒有通過牛客網的檢查,提示如下,運行錯誤:請檢查是否存在數組越界非法訪問,野指針亂訪問,空指針亂訪問等情況。但我覺得思路應該沒什么問題,還請前輩指教。
