120. 三角形最小路径和

120. 三角形最小路径和

1. 题目描述
题目链接

给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
        [2],
       [3,4],
      [6,5,7],
     [4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
说明:
如果你可以只使用 O(n) 的额外空间(n 为三角形的总行数)来解决这个问题,那么你的算法会很加分。

2. 题目分析
动态分析题,三角形,找出自顶向下的最小路径和,并且只能顺着下一行的相邻节点,如果事例不好找规律,我们可以将其转变成这样:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
现在,可以明显的看出,相邻的节点,就是下一行,跟自己同一列和后一列的节点。分析中,自顶向下寻找最小路径和,发现随着往下走,可能的结果会越来越多,不方便存储,所以可以自下而上分析。每次往上走时,给上一层的每一个节点提供最小的节点(即相邻节点之间的最小节点),那么,最终到达顶点时,得到的路径和一定是最小路径和。

3. 解决思路

状态:dp[i]表示自下而上到达这个节点时,所需要的最小路径和。
状态转移方程:f(n) = min(f(n) , f(n+1)) + nums[j] (n >=3);

4. 代码实现(java)

package com.algorithm.leetcode.dynamicAllocation;

import java.util.ArrayList;
import java.util.List;

/**
 * Created by 凌 on 2018/12/13.
 * 描述:120. 三角形最小路径和
 */
public class MinimumTotal {
    public static void main(String[] args) {
        List> triangle = new ArrayList<>();
        List nums = new ArrayList<>();
        nums.add(2);
        triangle.add(nums);
        nums = new ArrayList<>();
        nums.add(3);
        nums.add(4);
        triangle.add(nums);
        nums = new ArrayList<>();
        nums.add(6);
        nums.add(5);
        nums.add(7);
        triangle.add(nums);
        nums = new ArrayList<>();
        nums.add(4);
        nums.add(1);
        nums.add(8);
        nums.add(3);
        triangle.add(nums);
        int result = minimumTotal(triangle);
        System.out.println(result);
    }

    public static int minimumTotal(List> triangle) {
        if (triangle == null){
            return 0;
        }
        int len = triangle.size();
        int[] dp = new int[len];
        List nums;
        for (int j = 0; j < len; j++) {
            dp[j] = triangle.get(len-1).get(j);
        }
        for (int i = len - 2; i >= 0; i--) {
            nums = triangle.get(i);
            for (int j = 0; j <= i; j++) {
                dp[j] = Math.min(dp[j],dp[j+1])+ nums.get(j);
            }
        }
        return dp[0];
    }
}

···

你可能感兴趣的:(leetcode刷题,leetcode算法刷题)