NO.120 三角形最小路径和

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

例如,给定三角形:

[
     [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%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值