给出一个三角形状的整数list,从第一行开始向下移动,每次只能向下一行相邻的数移动,要求求出从第一行
到最后一行所经过的数字的和最小的方法。
1. 自顶向下计算
public int minimumTotal(List<List<Integer>> triangle)
{
int row = triangle.size(); // 行数
if (row == 0) // triangle长度为0
return 0;
int[][] res = new int[row][row]; // 记录从第一行到每个点的最小值
int minSum = Integer.MAX_VALUE; // 借助于求出最小值
// 先处理第一行
List<Integer> list0 = triangle.get(0);
//if (list0.size() == 0)
//return 0;
if (row == 1)
return list0.get(0);
res[0][0] = list0.get(0);
// 再处理余下的几行
for (int i=1; i<row; i++)
{
List<Integer> list = triangle.get(i);
for (int j=0; j<list.size(); j++)
{
// 处理第i行的第一个位置的元素
if (j == 0)
{
res[i][j] = res[i-1][j] + list.get(j);
}
// 处理第i行的最后一个位置的元素
else if (j == list.size() - 1)
{
res[i][j] = res[i-1][j-1] + list.get(j);
}
// 处理第i行中间位置的元组
else
{
res[i][j] = Math.min(res[i-1][j], res[i-1][j-1]) + list.get(j);
}
// 如果当前行是最后一行
if (i == row - 1)
{
if (minSum > res[i][j])
minSum = res[i][j];
}
}
}
return minSum;
}
2. 自底向上计算
public int minimumTotal(List<List<Integer>> triangle)
{
int m = triangle.size(); // 得到二维列表的大小
for (int i = m - 2; i >= 0; i--) // i从倒数第2层开始循环
{
for (int j = 0; j < i + 1; ++j) // 第i层的下一层
{
int old = triangle.get(i).get(j);
triangle.get(i).set(j, old + Math.min(triangle.get(i + 1).get(j), triangle.get(i + 1).get(j + 1)));
}
}
return triangle.get(0).get(0); // 返回第一个元素
}