leetcode120. 三角形最小路径和
给定一个三角形,找出自顶向下的最小路径和。每一步只能移动到下一行中相邻的结点上。
例如,给定三角形:
[
[2],
[3,4],
[6,5,7],
[4,1,8,3]
]
自顶向下的最小路径和为 11(即,2 + 3 + 5 + 1 = 11)。
和64题最小路径的解法基本一样,点(i,j)只能由(i,j-1)和(i-1,j-1)到达,也就是正上方和左上方。只不过最后并没有限定要到达最后一行的哪个点,所以最后还需要遍历一遍最后一行,找出最小的。(后面会优化)
public int minimumTotal(List<List<Integer>> triangle) {
for (int i = 1; i < triangle.size(); i ++) {
List<Integer> preList = triangle.get(i - 1);//上一层
List<Integer> list = triangle.get(i);
for (int j = 0; j < list.size(); j ++) {
int a = list.get(j);//当前的数字
int upa = 10000;//当前数字的上面
int leftUpa = 10000;
if (j < preList.size())
upa = preList.get(j);
if (j > 0)
leftUpa = preList.get(j - 1);
list.set(j,Math.min(a + upa, a + leftUpa));
//set(int,e)
}
}
int min = 10000;
List<Integer> finalList = triangle.get(triangle.size() - 1);
for (int i = 0; i < finalList.size(); i ++) {
min = Math.min(finalList.get(i),min);
}
return min;
}
也可以这样想,自底向上,最后到达的终点是(0,0),这样最后直接输出(0,0)就行了。
public int minimumTotal(List<List<Integer>> triangle) {
for (int i = triangle.size() - 2; i >= 0; i --) {
List<Integer> downList = triangle.get(i + 1);//下一层
List<Integer> list = triangle.get(i);
for (int j = 0; j < list.size(); j ++) {
int a = list.get(j);//当前的数字
int downa = 10000;//当前数字的上面
int rightDowna = 10000;
//if (j < preList.size())//这一层的下一层一定会有
downa = downList.get(j);
//if (j < list.size() - 1)
rightDowna = downList.get(j + 1);
list.set(j,Math.min(a + downa, a + rightDowna));
//set(int,e)
}
}
// int min = 10000;
// List<Integer> finalList = triangle.get(triangle.size() - 1);
// for (int i = 0; i < finalList.size(); i ++) {
// min = Math.min(finalList.get(i),min);
// }
return triangle.get(0).get(0);
}
leetcode 71/100