題目:
在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。
輸入乙個有向圖,該圖由乙個有著n個節點 (節點值不重複1, 2, ..., n) 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。
結果圖是乙個以邊
組成的二維陣列。 每乙個邊
的元素是一對[u, v]
,用以表示有向圖中連線頂點u
andv
和頂點的邊,其中父節點u
是子節點v
的乙個父節點。
返回一條能刪除的邊,使得剩下的圖是有n個節點的有根樹。若有多個答案,返回最後出現在給定二維陣列的答案。
示例:
輸入: [[1,2], [1,3], [2,3]]輸出: [2,3]
解釋: 給定的有向圖如下:
1/ \
v v
2-->3
輸入: [[1,2], [2,3], [3,4], [4,1], [1,5]]輸出: [4,1]
解釋: 給定的有向圖如下:
5 <- 1 -> 2
^ |
| v
4 <- 3
題解:
在以上題目中有一句比較關鍵的句子 :該圖由乙個有著n個節點 (節點值不重複1, 2, ..., n) 的樹及一條附加的邊構成。附加的邊
的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在的邊。
這句話其實是引導我們思路的,我們可以知道題目所說的有根樹具有三個性質。第一,有根樹存在入度為0的節點(根節點),第二有根樹除了
根節點其他節點的入度都為1。第三有根樹所有節點都是連通的。
如若一顆有根樹加上一條邊的話,那麼加上的邊存在以下三種情況:1)邊的兩端是同一節點
判定方式 : 直接看兩遍是否相等
處理 : 直接可以知道這條邊肯定不是原有的,返回當前邊
2)兩端不是同一節點,並且被指向的是根節點。
判定方式 : 如若被指向的那端統計之後出現了所有節點或者不存在入度為2的節點
處理 : 因為根被指向了後一定會形成環,故而處理的可能性很多(除去環內任意邊),但是需要注意是否存在示例2中的情況,如若除去邊[1,5],就會導致該有根樹不連通,並且依然有環。 因為是否連通使用並查集很容易檢測是否連通
,故而這裡我選擇了直接使用並查集。
3)兩端不是同一節點,並且被指向的是非根節點。
判定方式 : 剩下的情況都是3)//存在入度為2的節點
處理 : 因為存在入度為2的節點,所以在這就是在兩條指向入度為2節點內直接二選一,但是這裡不能隨便選,必須保證如若因為這條邊成環(例如示例一加上乙個節點4並且4指向2),也就是 : [[4, 2],[1,2], [1,3], [2,3]]
,這時指向2的一共有兩個節點 4 和 1,這時候如若選擇刪除[1,2]則會導致整張圖不連通,故而需要檢查連通性來選擇刪除兩個節點的哪個,依然使用並查集。
**:
1intn;
2public
int findredundantdirectedconnection(int
edges)
11int index = edges[i][1] - 1;
12if (table[index] != -1) else17}
18//
如若指向非根
19if (other != -1)
26for (int i = n - 1; i >= 0; i--) 31}
32return
newint
{};33}
3435
/**36
* 若除去第i條邊
37*
38*
@param
edges
39*
@parami40
* @return
41*/
42int
table;
4344
public
boolean isconnected(int edges, int
i) 49
for (int j = 0; j < n; j++)
53boolean flag = true;54
for (int k = 0; k < n; k++) else61}
62}63return
true;64
}6566public
boolean union(int i, int
j) 72 table[iindex] =jindex;
73return
true;74
}7576public
int find(int
i) 80
return
i;81 }
LeetCode 85 冗餘連線 II
題目 在本問題中,有根樹指滿足以下條件的有向圖。該樹只有乙個根節點,所有其他節點都是該根節點的後繼。每乙個節點只有乙個父節點,除了根節點沒有父節點。輸入乙個有向圖,該圖由乙個有著n個節點 節點值不重複1,2,n 的樹及一條附加的邊構成。附加的邊的兩個頂點包含在1到n中間,這條附加的邊不屬於樹中已存在...
LeetCode 85 最大矩形
給定乙個僅包含 0 和 1 的二維二進位制矩陣,找出只包含 1 的最大矩形,並返回其面積。示例 輸入 1 0 1 0 0 1 0 1 1 1 1 1 1 1 1 1 0 0 1 0 輸出 6此題和上一題的擴充套件,此題給的二維矩陣的每一行向上都形成了乙個直方圖,所以二維矩陣有多少行,就有多少個直方圖...
leetcode85 最大矩形
1.轉換成直方圖的做法 參考 利用leetcode84中的方法來做 首先要將給定的01矩陣轉換成84中的直方圖的樣子。每一行都對應乙個直方圖,且下一行直方圖是由上一行直方圖計算得到的。如果是0,則當前直方圖高為0,如果是1,則當前直方圖高度是上一層對應位置高度 1 1 0 1 0 0 1,0 1,0...