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 is11 (i.e., 2 + 3 + 5 + 1 = 11).
Note:
Bonus point if you are able to dothisusing only O(n) extra space, where n is the total number of rows in the triangle.
//注意划分子问题//错误答案
class MinPosition{
int min;
int position;
}
publicclass Solution {
private MinPosition [] minArray=null;
publicintminimumTotal(List<List<Integer>> triangle) {
int sum=0;
for(int i=0;i<triangle.size();i++)
{
sum=sum+triangle.get(i).size();
}
int [] value=newint[sum];
int index=0;
for(int i=0;i<triangle.size();i++)
{
for(int j=0;j<triangle.get(i).size();j++)
{
value[index++]=triangle.get(i).get(j);
}
}
minArray=new MinPosition[triangle.size()+1];
return f(value,triangle.size()-1).min;
}
public MinPosition f(int [] value,int n)
{
if(minArray[n]!=null)
{
return minArray[n];
}
if(n==0)
{
MinPosition minPosition=new MinPosition();
minPosition.min=value[n];
minPosition.position=0;
return minPosition;
}
int layer=n;
int start=sumN(n);
int count=n+1;
int min=Integer.MAX_VALUE;
// System.out.println(n+"tt");// System.out.println(value.length);// System.out.println(start+"****"+(start+count));
MinPosition child=f(value,n-1);
int left=child.position-sumN(n-1)+sumN(n);
int right=left+1;
int position=-1;
if(value[left]<value[right])
{
min=child.min+value[left];
position=left;
}
else
{
min=child.min+value[right];
position=right;
}
MinPosition minPosition=new MinPosition();
minPosition.min=min;
minPosition.position=position;
minArray[n]=minPosition;
return minPosition;
}
publicintsumN(int n)
{
int sum=0;
for(int i=1;i<=n;i++)
{
sum=sum+i;
}
return sum;
}
}
//这里划分的子问题,f(n)最优,不能保证f(n-1)最优
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int minArray[] []=new int[triangle.size()][triangle.size()];
for(int i=triangle.size()-1;i>=0;i--) { for(int j=0;j<triangle.get(i).size();j++) { if(i==triangle.size()-1) { minArray[i][j]=triangle.get(i).get(j); } else { minArray[i][j]=Math.min(minArray[i+1][j],minArray[i+1][j+1])+triangle.get(i).get(j); } } } return minArray[0][0];
}
}
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,...