leetcode [120]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.

题目大意:

给定一个三角形的数组,查找从顶端到底部的路径和的最小值

解法:

采用动态递归的方法,我看到的题目的提示是只使用了O(n)的额外空间,n是三角形数组的行数,并没有想到怎么使用那么小的空间,使用了O(n^2)的空间。

dp[i][j]代表的是从顶部到triangle[i][j]的最小路径值。发现dp[i][j]只依赖于dp[i-1][j-1]和dp[i-1][j]。

找出的关系为:dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j)

java:

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        int [][]dp=new int[triangle.size()][triangle.size()];
        dp[0][0]=triangle.get(0).get(0);
        for(int i=1;i<triangle.size();i++){
            for(int j=0;j<triangle.get(i).size();j++){
                if(j==0) dp[i][j]=dp[i-1][j]+triangle.get(i).get(j);
                else if (j==triangle.get(i).size()-1) dp[i][j]=dp[i-1][j-1]+triangle.get(i).get(j);
                else dp[i][j]=Math.min(dp[i-1][j],dp[i-1][j-1])+triangle.get(i).get(j);
            }
        }
        int res=Integer.MAX_VALUE;
        for(int i=0;i<triangle.size();i++) res=Math.min(res,dp[triangle.size()-1][i]);

        return res;
    }
}

 看了一下别人的解决方法,因为我们这是从上到下进行动态规划,所以需要的空间是O(n^2),可以从下到上进行动态规划,从最底层的节点开始,最小路径就是节点本身的值。然后后面第k行第i个节点的最小路径是两个子路径较小者加上其自身的值。

找出关系为:dp[j]=min(dp[j],dp[j+1])+triangle[i][j]

class Solution {
    public int minimumTotal(List<List<Integer>> triangle) {
        if(triangle==null||triangle.size()==0) return 0;
        int m=triangle.size();
        int n=triangle.get(m-1).size();
        int dp[]=new int [n];
        for(int i=0;i<n;i++) dp[i]=triangle.get(m-1).get(i);
        for(int i=m-2;i>=0;i--){
            for(int j=0;j<triangle.get(i).size();j++){
                dp[j]=Math.min(dp[j],dp[j+1])+triangle.get(i).get(j);
            }
        }
        return dp[0];
    }
}

  

猜你喜欢

转载自www.cnblogs.com/xiaobaituyun/p/10711046.html