LeetCode解题 120:Triangle
Problem 120: Triangle [Medium]
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.
来源:LeetCode
解题思路
本题使用动态规划思想,与题解119:Pascal’s Triangle II类似。
题中要求只使用
O
(
n
)
O(n)
O(n)的额外空间,按动规的思想,只需保存一个长度为
n
n
n的数组,每一层计算时从后往前计算,minlist(j)只需要用到上一层的minlist(j)和minlist(j-1),而且修改minlist(j)后不会影响到minlist(j-1)的计算,因此只需要
O
(
n
)
O(n)
O(n)的空间即可。
公式为:
m
i
n
l
i
s
t
(
j
)
=
{
m
i
n
l
i
s
t
(
j
)
+
t
r
i
a
n
g
l
e
(
i
,
0
)
j
=
0
;
m
i
n
l
i
s
t
(
j
−
1
)
+
t
r
i
a
n
g
l
e
(
i
,
i
)
j
=
i
;
min
{
m
i
n
l
i
s
t
(
j
−
1
)
,
m
i
n
l
i
s
t
(
j
)
}
+
t
r
i
a
n
g
l
e
(
i
,
j
)
o
t
h
e
r
w
i
s
e
.
minlist(j) = \begin{cases} minlist(j) + triangle(i,0) & j = 0;\\ minlist(j-1) + triangle(i,i) & j = i;\\ \min\{minlist(j-1), minlist(j)\} + triangle(i,j) & otherwise. \end{cases}
minlist(j)=⎩⎪⎨⎪⎧minlist(j)+triangle(i,0)minlist(j−1)+triangle(i,i)min{minlist(j−1),minlist(j)}+triangle(i,j)j=0;j=i;otherwise.
其中,
i
i
i代表层数,
m
i
n
l
i
s
t
(
j
)
minlist(j)
minlist(j)代表到达第
j
j
j个数的最小路径,数组
m
i
n
l
i
s
t
minlist
minlist的更新是in-place的。
最后计算出第n层后,只需返回minlist中的最小值。
运行结果:
要点:动态规划
Solution (Java)
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int N = triangle.size();
int[] minlist = new int[N];
minlist[0] = triangle.get(0).get(0);
for(int i = 1; i < N; i++){
minlist[i] = minlist[i-1] + triangle.get(i).get(i);
for(int j = i-1; j > 0; j--){
minlist[j] = Math.min(minlist[j], minlist[j-1]) + triangle.get(i).get(j);
}
minlist[0] = minlist[0] + triangle.get(i).get(0);
}
return Arrays.stream(minlist).min().getAsInt();
}
}