題目:
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。
相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 1 的兩個結點。
[2],
[3,4],
[6,5,7],
[4,1,8,3]
示例,返回11,路徑為2-3-5-1,不要求返回路徑,輔助空間不限(越小越好)
解:說一下我自己的解題過程,最開始想到的是遞迴,遞迴也可以解出來,但是無用的計算太多了,所以最終使用動態規劃進行計算。
遞迴:
/// 尋找三角形最短路徑
/// - parameters:
/// - ********: 二維陣列
/// - i: 當前起始i,最開始應該傳0
/// - j: 當前起始j,最開始應該傳0
/// - currentsum: 當前位置之前的最小值
/// - returns: 最小值
func findchild(_ ********: [[int]], _ i : int, _ j : int, _ currentsum : int) -> int
let sum1 = findchild(********, i + 1, j, sums);
let sum2 = findchild(********, i + 1, j + 1, sums);
return sum1 < sum2 ? sum1 : sum2;
}
遞迴方法的複雜度會跟二維陣列的複雜度 呈現指數增長。所以不可能用該方法。
動態規劃:
func minimumtotal(_ ********: [[int]]) -> int
if n == 0
//陣列也可以換成字典(hashmap)[int: int]()
var arr = [int]();
for _ in (0...(n - 1))
arr[0] = ********[0][0];
for i in (1...(n - 1)) else if j == i else }}
var num : int = arr[0];
for i in (1...(n - 1))
}return num;
}
個人認為,動態規劃最重要的是尋找規律,找到規律後,即可實現。
簡單介紹一下,上面的。
可以建立乙個n*n的二維陣列,利用i,j位置記錄到達i,j位置的最短路徑。
上面的**,利用乙個n的陣列,來記錄到達最底層i位置的最短路徑。
測試**:
func testminimumtotal()
三角形最小路徑和
一 問題解釋 給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。如 給定三角形11 即2 3 5 1 11 二 思路解釋 類似 楊輝三角 問題,採用動態規劃演算法 自三角形的第二行從上到下遍歷,體現在下標為i 1。因為二維向量由i 0開始,i 0代表第一行。每一行,從前...
三角形最小路徑和
題目 力扣 解題思路 先用了回溯法,超時了,後來看題解有人用了動態規劃,我也自己想想了一下,最後想出來了,耶耶耶!class solution else return dp 0 回溯法,超時了 int res integer.max value int n public int minimumtot...
三角形最小路徑和
給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。例如,給定三角形 2 3,4 6,5,7 4,1,8,3 自頂向下的最小路徑和為11 即,2 3 5 1 11 方法一 用二維陣列做,先定義乙個二維陣列arr,陣列大小為所傳引數的大小 1 然後從底向上遍歷陣列 按遞推公...