标签:div pat HERE 数组 may minimum otto 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];
}
}
标签:div pat HERE 数组 may minimum otto triangle 开始
原文地址:https://www.cnblogs.com/xiaobaituyun/p/10711046.html