• Triangle


    Given a triangle, find the minimum path sum from top to bottom. Each step you may move to adjacent numbers on the row below.

    For example, given the following triangle

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

    The minimum path sum from top to bottom is 11 (i.e., 2 + 3 + 5 + 1 = 11).

    Note:
    Bonus point if you are able to do this using only O(n) extra space, where n is the total number of rows in the triangle.

    Ref:http://www.cnblogs.com/feiling/p/3269609.html

    [解题思路]

    该题是经典的DP问题,状态可以定义成dp[node]表示从当前node到bottom的最小路径和,对于最下面一层,因为它们是最底层,故它们到bottom的最小路径和就是它们自身;再往上一层,如节点6,它到达bottom的最小路径和即为节点4与节点1之间的最小值加上节点6自身的值

    由以上分析得出状态迁移方程:

    dp[node] = value[node] + min(dp[child1], dp[child2])

    另外本题要求时间复杂度为:O(n), n为三角形的行数

    逐行扫描,每一个位置能取得的最小sum,是该元素上面两个能取得的最小sum中最小的那一个sum加上自己的值。只需要开一个数组重复利用就行了。

    实现的时候,有些繁琐的地方,这个题比较好从下往上扫描。如果从上往下,其中minV的初始值问题就很头疼。

    public class Solution {
        public int minimumTotal(ArrayList<ArrayList<Integer>> triangle) {
            if(triangle == null || triangle.size() == 0){
                return 0;
            }
            int row = triangle.size();
            int[] num = new int[row];
            for(int i = row-1; i>= 0; i--){
                int col = triangle.get(i).size();
                for(int j = 0; j< col; j++){
                    if(i == row-1){
                        num[j] = triangle.get(i).get(j);
                        continue;
                    }
                    num[j] = Math.min(num[j] , num[j+1])+ triangle.get(i).get(j);
                }
            }
         return num[0];   
        }
    }
  • 相关阅读:
    读书笔记_Effective_C++_条款三十一:将文件间的编译依存关系降至最低(第三部分)
    Spring Boot进阶系列一
    职场进阶之七种武器
    大龄IT程序员的救赎之道
    Web Service
    生产者消费者问题
    SpringBoot集成Apache Shiro
    简单模拟医院叫号系统
    IT小团队管理者的突围之道
    内部推荐
  • 原文地址:https://www.cnblogs.com/RazerLu/p/3552577.html
Copyright © 2020-2023  润新知