🌗 120. 三角形最小路径和

吞佛童子2022年10月10日
  • algorithm
  • dp
小于 1 分钟

🌗 120. 三角形最小路径和

难度: 🌗

问题描述

img_16.png


解法

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        // 思路:
        // 每行都可以求出当前行所有点处的路径和,只需要保留这一行求下一行
        // dp[i][j] = min(dp[i - 1][j - 1], dp[i - 1][j]) + [i][j]
        int height = triangle.size();
        int max = 10001;

        int[] prev = new int[height + 1]; // 获取首行
        Arrays.fill(prev, max);
        prev[0] = triangle.get(0).get(0);

        if(height == 1) {
            return prev[0];
        }
        // h > 1
        int res = max;
        // System.out.println(Arrays.toString(prev));
        for(int i = 1; i < height; i ++) {
            List<Integer> orig = triangle.get(i); // 当前行原始值
            int[] cur = new int[height + 1];
            Arrays.fill(cur, max);

            // prev 的 len == i 可以确定下来 [0, i - 1]
            for(int j = 0; j <= i; j ++) {
                int curVal = max;
                if(j - 1 >= 0 && j - 1 <= i - 1) {
                    curVal = Math.min(curVal, prev[j - 1]);
                }
                if(j >= 0 && j <= i - 1) {
                    curVal = Math.min(curVal, prev[j]); // 防止超范
                }
                curVal += orig.get(j);
                cur[j] = curVal;
                
                if(i == height - 1) {
                    res = Math.min(res, curVal);
                }
            }
            prev = cur;
            // System.out.println(Arrays.toString(cur));
        }
        return res;
    }
}

输出

img_15.png

上次编辑于: 2022/10/10 下午8:43:48
贡献者: liuxianzhishou