刷题-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 }

 

posted @ 2021-09-17 12:54  Dul  阅读(37)  评论(0编辑  收藏  举报