刷题-Leetcode-120. 三角形最小路径和
120. 三角形最小路径和
题目链接
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/triangle/
题目描述
给定一个三角形 triangle ,找出自顶向下的最小路径和。
每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一步可以移动到下一行的下标 i 或 i + 1 。
示例 1:
输入:triangle = [[2],[3,4],[6,5,7],[4,1,8,3]]
输出:11
解释:如下面简图所示:
2
3 4
6 5 7
4 1 8 3
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
示例 2:
输入:triangle = [[-10]] 输出:-10
示例 3:
输入:head = [1] 输出:[1]
题目分析
自顶向下
要考虑边界,多了一些代码。但也更好理解。
1 int minimumTotal(int** triangle, int triangleSize, int* triangleColSize){ 2 int f[triangleSize][triangleSize]; 3 memset(f, 0, sizeof(f)); 4 f[0][0] = triangle[0][0]; 5 for(int i=1;i<triangleSize;i++){ 6 f[i][0] = f[i-1][0] + triangle[i][0]; 7 for(int j=1;j<i;j++){ 8 int a = f[i-1][j-1]; 9 int b = f[i-1][j]; 10 f[i][j] = (a>b?b:a) +triangle[i][j]; 11 } 12 f[i][i] = f[i-1][i-1] + triangle[i][i]; 13 } 14 int min = f[triangleSize-1][0]; 15 for(int i=1;i<triangleSize;i++){ 16 if(f[triangleSize-1][i]<min){ 17 min = f[triangleSize-1][i]; 18 } 19 } 20 return min; 21 }
从下到上
不同判断边界,更好。
可以简化代码,不定义新的数组。
注意:从下到上要i--,不要马虎哦。
1 int minimumTotal(int** triangle, int triangleSize, int* triangleColSize){ 2 //自下向上 3 int f[triangleSize][triangleSize]; 4 for(int i=0;i<triangleSize;i++){ 5 f[triangleSize-1][i] = triangle[triangleSize-1][i]; 6 } 7 for(int i=triangleSize-2;i>=0;i--){//注意i-- 8 for(int j=0;j<=i;j++){ 9 int b = f[i+1][j+1]; 10 int a = f[i+1][j]; 11 f[i][j] = (a>b?b:a)+triangle[i][j]; 12 } 13 } 14 return f[0][0]; 15 16 }