给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。
int minimumTotal(int** triangle, int triangleSize, int* triangleColSize){
if(triangleSize<=0)return 0;
int *path_len=(int *)calloc(triangleSize+1,sizeof(int));
for(int i=0;i<triangleSize;i++)
{
path_len[0]=path_len[1];
int tmp;
for(int j=1;j<triangleColSize[i];j++)
{
tmp=path_len[0];
path_len[0]=path_len[j];
path_len[j]=tmp<path_len[j]?tmp+triangle[i][j-1]:path_len[j]+triangle[i][j-1];
}
path_len[triangleColSize[i]]=path_len[0]+triangle[i][triangleColSize[i]-1];
}
int ret=INT_MAX;
for(int i=1;i<=triangleColSize[triangleSize-1];i++)
{
if(ret>path_len[i])ret=path_len[i];
}
free(path_len);
return ret;
}
执行用时 :12 ms, 在所有C提交中击败了68.83% 的用户
内存消耗 :8 MB, 在所有C提交中击败了63.89%的用户