Leetcode 120. 三角形最小路径和

Leetcode 120. 三角形最小路径和_第1张图片
思路1:自顶向下
minimumTotal1:自顶向下
从第0行开始计数, 第i行有i+1个数字
边界条件:
1.f[0][0] = triangle.get(0).get(0);
2.每行最右端只能由上一行的最右端得到
3.每行的最左端只能由上一行的最左端得到
4.取 f[n-1][0] 到 f[n-1][n-1] 中的最小值,即为答案

class Solution {
     
    // 从上至下,f中最后一行的最小值就是答案
    public int minimumTotal(List<List<Integer>> triangle) {
     
        // 从第0行开始计数, 第i行有i+1个数字

        int n = triangle.size();
        int[][] f = new int[n][n];
        f[0][0] = triangle.get(0).get(0);
        for (int i = 1; i < n; i++) {
     
            //每行最左端
            f[i][0] = f[i - 1][0] + triangle.get(i).get(0);

            // 每行中间
            for (int j = 1; j < i; j++) {
     
                f[i][j] = Math.min(f[i - 1][j - 1], f[i - 1][j]) + triangle.get(i).get(j);
            }

            //每行最右端
            f[i][i] = f[i - 1][i - 1] + triangle.get(i).get(i);
        }

        // f[n-1][0] 到 f[n-1][n-1] 中的最小值
        // 最后一行最左端
        int minTotal = f[n - 1][0];

        // f[n-1][i] 最后一行最右端
        for (int i = 1; i < n; i++) {
     
            minTotal = Math.min(minTotal, f[n - 1][i]);
        }
        return minTotal;
    }
}

思路2:自底向上,从三角形的最后一行开始递推 ,dp[i][j] 表示从点 (i, j) 到底边的最小路径和。
注意点:数组开[n][n]大小的话 dp[i + 1][j]会越界
Leetcode 120. 三角形最小路径和_第2张图片

public int minimumTotal2(List<List<Integer>> triangle) {
     
    int n = triangle.size();
    // dp[i][j] 表示从点 (i, j) 到底边的最小路径和。  数组开[n][n]大小的话 dp[i + 1][j]会越界
    int[][] dp = new int[n + 1][n + 1];
    // 从三角形的最后一行开始递推。
    for (int i = n - 1; i >= 0; i--) {
     
        for (int j = 0; j <= i; j++) {
     
            dp[i][j] = Math.min(dp[i + 1][j], dp[i + 1][j + 1]) + triangle.get(i).get(j);
        }
    }
    return dp[0][0];
}

你可能感兴趣的:(Leetcode,动态规划)