给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[ [2], [3,4], [6,5,7], [4,1,8,3] ]
自顶向下的最小路径和为 11
(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
C
int minimumTotal(int** triangle, int triangleRowSize, int *triangleColSizes)
{
int n=triangleRowSize;
int* tmp=triangle[n-1];
for(int i=n-2;i>=0;i--)
{
int m=triangleColSizes[i];
for(int j=0;j<m;j++)
{
int min=tmp[j]<tmp[j+1]?tmp[j]:tmp[j+1];
tmp[j]=triangle[i][j]+min;
}
}
return tmp[0];
}
C++
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle)
{
int n=triangle.size();
vector<int> tmp=triangle[n-1];
for(int i=n-2;i>=0;i--)
{
int m=triangle[i].size();
for(int j=0;j<m;j++)
{
tmp[j]=triangle[i][j]+min(tmp[j],tmp[j+1]);
}
}
return tmp[0];
}
};
python
class Solution:
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
n=len(triangle)
tmp=triangle[n-1]
for i in range(n-2,-1,-1):
m=len(triangle[i])
for j in range(m):
tmp[j]=triangle[i][j]+min(tmp[j],tmp[j+1])
return tmp[0]