三角形最小路徑和(個人解題思路記錄)

2021-10-08 03:25:28 字數 1400 閱讀 9296

題目:

給定乙個三角形,找出自頂向下的最小路徑和。每一步只能移動到下一行中相鄰的結點上。

相鄰的結點 在這裡指的是 下標 與 上一層結點下標 相同或者等於 上一層結點下標 + 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 然後從底向上遍歷陣列 按遞推公...