算法训练:Triangle

来源:互联网 发布:html的sql注入 编辑:程序博客网 时间:2024/06/05 16:38

题目链接:https://leetcode.com/problems/triangle/#/description


题目描述:

      给定一个三角形,求从三角形顶部到底部的路径长度的最小值。  

      例如:给定如下矩阵

[     [2],    [3,4],   [6,5,7],  [4,1,8,3]]

      每一步只能到达下一行的邻接点,例如第二行中的3只能到达6或5阵,所以路径的最小值为:2 + 3 + 5 + 1 = 11

解题思路:

     从第二行遍历三角形的每一行(因为第一行只有一个数,是必选无疑的),然后求出在该点时的路径长度是多少

     由于每一步只能到达下一行的邻接点,所以对于每一行的第一个数来说,只可能是其正上方的点到达它,最后一个数只能是其左上方的邻接点到达

     它,即:

              每一行的第一个数:triangle[i][j] += triangle[i-1][j]

              每一行的最后一个数:triangle[i][j] += triangle[i-1][j-1]

    对于其他中间点,达到该点,则有两种方式,要么是其正上方的点,要么是其右上方的邻接点:

              triangle[i][j] += min(triangle[i-1][j-1], triangle[i-1][j])

   以这种方式遍历完数组后,triangle[i][j]保存的是到达第i行第j列的这个点的路径的最小值。   

   所以要求顶部到底部的路径最小值,只需求得最后一行中的最小值即可。 

   int minimumTotal(vector<vector<int>>& triangle) {        int row = triangle.size();        if(row == 0) return -1;        for (int i = 1; i < row; ++i) {            for (int j = 0; j < triangle[i].size(); ++j) {                //边界值                if (j == 0) triangle[i][j] += triangle[i-1][j];//第i个数组的第一个数                else if (j == triangle[i].size()-1) triangle[i][j] += triangle[i-1][j-1];//第i个数组的最后一个数                //非边界值                else {                    triangle[i][j] += min(triangle[i-1][j-1], triangle[i-1][j]);                }            }        }        //最后一行中的最小值即为所求        int result = triangle[row-1][0];        for (int i = 0; i < triangle[row-1].size(); ++i) {            result = min(result, triangle[row-1][i]);        }        return result;    }

运行结果:

Your Input
[[1],[4,5],[2,7,1],[5,3,2,6]]
Your answer
9
Expected answer
9











原创粉丝点击