• 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];
        }
    }
  • 相关阅读:
    eclipse的优化 gc.log
    一次使用Eclipse Memory Analyzer分析Tomcat内存溢出
    JVM系列三:JVM参数设置、分析
    热加载
    彻底理解JAVA动态代理
    Linux下查看Web服务器当前的并发连接数和TCP连接状态
    个人博客 V0.0.3 版本 ...
    HTML5本地存储——IndexedDB(一:基本使用)
    如何在Blog中加入Google Analytics
    webpack中实现按需加载
  • 原文地址:https://www.cnblogs.com/xiaolovewei/p/8268433.html
Copyright © 2020-2023  润新知