给出一个三角形,计算从三角形顶部到底部的最小路径和,每一步都可以移动到下面一行相邻的数字,
例如,给出的三角形如下:
[↵ [2],↵ [3,4],↵ [6,5,7],↵ [4,1,8,3]↵]
最小的从顶部到底部的路径和是2 + 3 + 5 + 1 = 11。注意:
如果你能只用O(N)的额外的空间来完成这项工作的话,就可以得到附加分,其中N是三角形中的行总数。
Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.
For example, given the following triangle
[↵ [2],↵ [3,4],↵ [6,5,7],↵ [4,1,8,3]↵]↵
The minimum path sum from top to bottom is11(i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.
<?php
/**
* @param $arrTriangle
* 每个节点的最小$arrMin
*/
function minimumTotal($arrTriangle) {
$num = count($arrTriangle);
$arrMin = array();
//先从最下面一层开始
for ($i = $num - 1; $i >= 0 ;$i --) {
//求所有层的最小路径值
foreach ($arrTriangle[$i] as $key => $value) {
if ($i == $num - 1) {
$arrMin[$i][$key] = $value;
continue;
}
$arrMin[$i][$key] = $value + min($arrMin[$i + 1][$key],$arrMin[$i + 1][$key + 1]);
}
}
return $arrMin[0][0];
}
$arr=[
[2],
[3,4],
[6,5,7],
[4,1,8,3],
];
$ret = minimumTotal($arr);
print $ret;
需要减少额外空间的使用,可以使用传进来的数组。
<?php
/**
* @param $arrTriangle
* 每个节点的最小用入参数组存储
*/
function minimumTotal($arrTriangle) {
$num = count($arrTriangle);
//先从最下面第二层开始,第一层的最小就是自身
for ($i = $num - 2; $i >= 0 ;$i --) {
//求所有层的最小路径值
foreach ($arrTriangle[$i] as $key => $value) {
$arrTriangle[$i][$key] = $value + min($arrTriangle[$i + 1][$key],$arrTriangle[$i + 1][$key + 1]);
}
}
return $arrTriangle[0][0];
}
$arr=[
[2],
[3,4],
[6,5,7],
[4,1,8,3],
];
$ret = minimumTotal($arr);
print $ret;