演算法 最小高度樹
leetcode 310 題 [medium]
中:最小高度樹
英: Minimum Height Trees
題解
核心:拓撲排序法
時間複雜度:O(n*minH)
空間複雜度:O(n)
/**
* @param {number} n
* @param {number[][]} edges
* @return {number[]}
*/
var findMinHeightTrees = function(n, edges) {
/**
* 拓撲排序法
* 步驟:每次刪除所有當前入度為1的結點,直到最後剩下的結點數 <= 2
* 原理:
* 1. 刪除入度為1的結點:相當於剪去所有當前的葉節點,最小高度樹的層數必然(僅)下降1層
* (1) 所以最小高度樹的高度等於(刪除次數 + 剩下結點數)(假設只有一個結點時高度為1)
* 2. 最後結點 <= 2
* (1) 最後剩下1個結點:那麼該結點為唯一解
* (2) 最後剩下2個結點:以這兩個結點為根的樹都是最小高度樹
* (3) 最後剩下3個結點:那麼必然有兩個入度為1的結點和一個入度大於1的結點,可再次通過刪除所有當前入度為1的結點進而使得樹的高度(僅)下降1層
* (4) 最後剩下結點>3,與(3)同理,可以通過剪枝使樹高度下降
*
* 時間複雜度:O(n*minH):O(n)(構建入度陣列(鄰接列表))+ ≈O(n)*O(minH)(迴圈刪除入度為1的結點) + O(n)(計算結果) => O(n*minH)
* 空間複雜度:O(n):O(2*(n-1))(鄰接列表大小,其實就等於edges中的結點個數) => O(n)
*/
// 初始化入度陣列(其實就是鄰接列表)
let inDegreeArr = Array.from({length: n}, ()=>[]);
for(let i=0, len=edges.length; i<len; i++){
let item = edges[i];
inDegreeArr[item[0]].push(item[1]);
inDegreeArr[item[1]].push(item[0]);
}
// 迴圈刪除入度為1的結點
let restNodesCount = n;
while(restNodesCount > 2){
let needToDelete = [];
for(let i=0; i<n; i++){
if(inDegreeArr[i] && inDegreeArr[i].length === 1){
needToDelete.push(i);
}
}
// 一次性刪除
for(let i=0, len=needToDelete.length; i<len; i++){
let node = needToDelete[i];
let connected = inDegreeArr[node][0]; // 連線的結點
inDegreeArr[node] = null; // 標識為已刪除
inDegreeArr[connected].splice(inDegreeArr[connected].indexOf(node), 1);
restNodesCount--;
}
}
// 結果
let result = [];
for(let i=0; i<n; i++){
inDegreeArr[i] && result.push(i);
}
return result;
};
相關文章
- 最小生成樹的演算法演算法
- 最小生成樹__Kurskal演算法演算法
- 最小生成樹__Prim演算法演算法
- 【演算法學習】最小生成樹演算法
- 演算法-圖論-最小生成樹演算法圖論
- 最小生成樹之 Prim 演算法演算法
- 最小樹形圖(朱劉演算法)演算法
- 最小生成樹(MinSpanTree)的Kruskal演算法演算法
- 最小生成樹——Prim演算法和Kruscal演算法演算法
- 最小生成樹-Prim演算法和Kruskal演算法演算法
- 最小生成樹:Kruskal演算法和Prim演算法演算法
- 圖論中的最小生成樹演算法圖論演算法
- Boruvka求最小生成樹(菠蘿演算法)演算法
- 最小生成樹prim普里姆演算法演算法
- 前端必會演算法 - 最小生成樹問題前端演算法
- 圖:310.最小高度數, 題解
- 【JAVA演算法】圖論演算法 --求最小生成樹Prim演算法Java演算法圖論
- (樹_)求最小深度
- 最小生成樹
- 如何在 Java 中實現最小生成樹演算法Java演算法
- 最小斯坦納樹初探
- 最小度限制生成樹
- 【模板】最小生成樹
- 求二叉樹的高度二叉樹
- 【圖論】最小生成樹圖論
- 圖的最小生成樹
- 【模板】最小生成樹-kruskal
- 最小生成樹專項
- 圖論 最小生成樹圖論
- 資料結構與演算法之最好學的最小生成樹資料結構演算法
- 最小生成樹(克魯斯卡爾演算法)資料結構演算法資料結構
- 最小生成樹的性質與prim演算法(C++實現)演算法C++
- 如何使用css實現跨瀏覽器的最小高度?CSS瀏覽器
- 最小生成樹---普里姆演算法(Prim演算法)和克魯斯卡爾演算法(Kruskal演算法)演算法
- prim 樸素 最小生成樹
- Prim 最小生成樹 圖解圖解
- 最小生成樹,Prim演算法與Kruskal演算法,408方向,思路與實現分析演算法
- Android XML靈活佈局之 EditText實現自適應高度同時限制最小和最大高度AndroidXML