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]; } }