美文网首页
【动态规划】leetcode 三角形最小路径和

【动态规划】leetcode 三角形最小路径和

作者: 修行者12138 | 来源:发表于2020-09-12 11:50 被阅读0次

    给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。

    相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 + 1 的两个结点。

    例如,给定三角形:

    [
         [2],
        [3,4],
       [6,5,7],
      [4,1,8,3]
    ]
    

    自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。

    来源:力扣(LeetCode)
    链接:https://leetcode-cn.com/problems/triangle

    AC代码

    public int minimumTotal(List<List<Integer>> triangle) {
        if (null == triangle || triangle.size() == 0) {
            return 0;
        }
        if (triangle.size() == 1) {
            return triangle.get(0).get(0);
        }
    
        // 从倒数第二层开始往上遍历
        for (int i = triangle.size() - 2; i >= 0; i--) {
            // 当前层
            List<Integer> current = triangle.get(i);
            // 下一层
            List<Integer> next = triangle.get(i + 1);
            for (int j = 0; j < current.size(); j++) {
                // 把当前元素设置为: 当前元素 + 相邻结点中的较小值
                current.set(j, current.get(j) + Math.min(next.get(j), next.get(j + 1)));
            }
        }
    
        return triangle.get(0).get(0);
    }
    



    image.png

    本方案的速度较慢,原因在于大量对List的操作,比如for循环中这一段

    for (int j = 0; j < current.size(); j++) {
        // 把当前元素设置为: 当前元素 + 相邻结点中的较小值
        current.set(j, current.get(j) + Math.min(next.get(j), next.get(j + 1)));
    }
    

    如果把对List的操作改为对基本类型数组的操作,速度就快一点,相当于以空间换时间

    public int minimumTotal(List<List<Integer>> triangle) {
        if (null == triangle || triangle.size() == 0) {
            return 0;
        }
        if (triangle.size() == 1) {
            return triangle.get(0).get(0);
        }
    
        int length = triangle.size();
        // 注意:这里定义的数组偏大,相当于多了一层虚拟的第length+1层,这一层的结点值都是0
        int[][] dp = new int[length + 1][length + 1];
    
        // 从第length层开始往上遍历
        for (int i = length - 1; i >= 0; i--) {
            // 当前层
            List<Integer> current = triangle.get(i);
            for (int j = 0; j < current.size(); j++) {
                // 把当前元素设置为: 当前元素 + 相邻结点中的较小值
                dp[i][j] = current.get(j) + Math.min(dp[i + 1][j], dp[i + 1][j + 1]);
            }
        }
    
        return dp[0][0];
    }
    
    image.png

    相关文章

      网友评论

          本文标题:【动态规划】leetcode 三角形最小路径和

          本文链接:https://www.haomeiwen.com/subject/uvynektx.html