zoukankan      html  css  js  c++  java
  • 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.

    题目是要求最小路径,对于一行的数据,每个数据都有可能是最小路径的最后一个元素。
    这题找递推公式。对于第k行的数据i处的路径和,sum[k][i]=Math.min(sum[k-1][i-1],sum[k-1][i])+triangle[k][i]。这样求到最后一行时,再求出最后一行的最小值就行。这样只需要一个二维数组就行,然后注意边界情况。
    这题是限制了空间,只能使用一个o(n)空间,也就是一维数组。我们重新审查这个三角形,从底下往上看,也就是从下往上计算路径和,sum[k][i]=min(sum[k+1][i],sum[k+1][i+1])+triangle[k][i];因为下一行元素比上一行元素多一个,所以上面式子没有边界问题。我们将上式行号去掉,简化为 一维数组:minlen[i]=Math.min(minlen[i],minlen[i+1])+triangle[k][i];为什么可以省略行号呢,因为用一维数组存数据时,下一行会先计算了存进数组,然后计算上一行,计算上一行时,只与当前元素和后面的有关,与前面的minlen无关,不会覆盖掉有用的下一行路径和数据。仔细体会上面的式子。
    最后计算到最后就是将最小路径和放到了minlen[0]。

    class Solution {
        public int minimumTotal(List<List<Integer>> triangle) {
            if(triangle==null||triangle.size()==0) return 0;
            int[] minLen=new int[triangle.size()+1];//最后多出来的一行 存为0,用于计算最后一行数据。
           
            for(int layer=triangle.size()-1;layer>=0;layer--){
                for(int i=0;i<=layer;i++){
                    minLen[i]=Math.min(minLen[i],minLen[i+1])+triangle.get(layer).get(i);
                }
            }
            
            return minLen[0];
        }
    }
  • 相关阅读:
    Core3.0部署后访问接口提示500.30
    Core3.0返回的Json数据大小写格式问题
    linux内核分析之fork()
    【转】【机器人学:运动规划】OMPL开源运动规划库的安装和demo
    【转】毫米波雷达和激光雷达的对比
    [转]开发者需要的 9 款代码比较工具
    [转]关于特征点法、直接法、光流法slam的对比
    [转]【视觉 SLAM-2】 视觉SLAM- ORB 源码详解 2
    [转]ORB特征提取-----FAST角点检测
    [转]图像金字塔
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8268433.html
Copyright © 2011-2022 走看看