题目大意:
有一个三角形矩阵,从最上边的顶点出发累加到底边,一共有多种情况,求这些情况中累加和的最小值
要求额外空间复杂度为O(n),n是行数
思路:
遍历矩阵,每走一步都更新当前值:
triangle[i][j] += min(triangle[i-1][j-1], triangle[i-1][j])
Python代码如下:
class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
rows = len(triangle)
for i in range(1, rows):
cols = len(triangle[i])
for j in range(0, cols):
if j == 0:
triangle[i][j] += triangle[i-1][j]
elif j == cols - 1:
triangle[i][j] += triangle[i-1][j-1]
else:
triangle[i][j] += min(triangle[i-1][j-1], triangle[i-1][j])
return min(triangle[rows-1])
附java代码
class Solution {
public int minimumTotal(List<List<Integer>> triangle) {
int rows = triangle.size();
// 上一行
List<Integer> lastLine = triangle.get(0);
for(int i = 1; i < rows; i++) {
// 本行
List<Integer> line = triangle.get(i);
line.set(0, line.get(0) + lastLine.get(0));
line.set(line.size()-1, line.get(line.size()-1) + lastLine.get(lastLine.size()-1));
for(int j = 1; j < line.size() - 1; j++) {
line.set(j, line.get(j) + Math.min(lastLine.get(j-1), lastLine.get(j)));
}
lastLine = line;
}
List<Integer> tailLine = triangle.get(rows-1);
int result = Integer.MAX_VALUE;
for(Integer i : tailLine) {
result = Math.min(result, i);
}
return result;
}
}