解题思路和剑指offer47、leetcode62、leetcode63、leetcode64类似。
但这里又稍有不同的是在两边边缘的顶点上一层只有一个顶点,所以两边边缘的顶点没得选择。
对于不知边缘的顶点,选择上一层相邻的两个顶点中最小的那个顶点。
具体实现如下:
class Solution {
public:
int minimumTotal(vector<vector<int>>& triangle) {
if (triangle.empty() || triangle[0].empty())
return INT_MAX; //这里返回INT_MAX而不返回0的原因是要与真实答案是0的情况进行区分
else if (triangle.size() == 1)
return triangle[0][0];
//处理每一层的顶点
int rows = triangle.size();
for (int i = 1; i < rows; ++i)
{
int cols = triangle[i].size();
for (int j = 0; j < cols; ++j)
{
if (j == 0) //左边边缘的顶点只有一种选择
triangle[i][j] += triangle[i-1][j];
else if (j == cols - 1) //右边便于顶点也只有一种选择
triangle[i][j] += triangle[i-1][j-1];
else //中间顶点选择上一层更小的路径
triangle[i][j] += (triangle[i-1][j-1] < triangle[i-1][j] ? triangle[i-1][j-1] : triangle[i-1][j]);
}
}
//找到最终答案
int res = triangle[rows-1][0];
for (int j = 1; j < triangle[rows-1].size(); ++j)
if (triangle[rows-1][j] < res)
res = triangle[rows-1][j];
return res;
}
};