LeetCode120 :三角形最小路径和

题目描述:

求解思路:动态规划

1、建立dp矩阵,矩阵的长度为三角形的底边元素数;

2、遍历三角形的每一行,更新dp矩阵,更新时候注意边界以及左上方元素的备份;

3、遍历结束后,找出dp中的最小元素,返回结果。

代码以及解释如下:

 1 class Solution { // 空间压缩 DP
 2     public int minimumTotal(List<List<Integer>> triangle) {
 3         int rows = triangle.size(); 
 4         if(rows == 0 || triangle == null) return 0;
 5         List<Integer> list = new ArrayList<>();
 6         list = triangle.get(rows-1); // 最后一个List也就是三角形的底边里面包含的元素最多
 7         int cols = list.size();
 8         int[] dp = new int[cols];
 9         list = triangle.get(0);
10         dp[0] = list.get(0); // 第一个元素
11         List<Integer> row = new ArrayList<>();
12         for(int i = 1; i < rows; i++){
13             row = triangle.get(i);
14             int size = row.size(); // 这一行里面包含的元素个数
15             int leftup = dp[0]; // 备份上一步中左上面的元素
16             for(int j = 0; j < size; j++){
17                 int temp = dp[j]; // 更新前的dp[j]将是更新后的leftup值
18                 if(j == 0){
19                     dp[j] = dp[j] + row.get(j); // 对于第一个元素的更新,其中第一个dp[j]是更新前的dp[j]
20                 } else if(j == size-1 && j != 0){ // 对本行最后一个元素更新
21                     dp[j] = leftup + row.get(j);
22                 }else{
23                     dp[j] = Math.min(leftup, dp[j]) + row.get(j);
24                 }
25                 leftup = temp;
26             }
27         }
28         int min = dp[0]; // 找到最小值
29         for(int d : dp){
30             if(d < min){
31                 min = d;
32             }
33         }
34         return min;
35     }
36 }
原文地址:https://www.cnblogs.com/zhang-yi/p/12883815.html