您的位置:首页 > 其它

LeetCode----Triangle

2015-09-17 08:52 218 查看
Triangle

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.

分析1:

简单的动态规划题。使用自底向上的方法,设f[i][j]表示在(i, j)位置上最小的总和,其动态转移方程为f[i][j] = min(f[i - 1][j], f[i - 1][j + 1]) + triangle[i][j].

代码1:

class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
t_len = len(triangle)
f = []
for i in range(t_len):
f.append([0] * (i+1))
for i in range(t_len):
f[t_len - 1][i] = triangle[t_len - 1][i]
for i in range(t_len - 2, -1, -1):
for j in range(i + 1):
f[i][j] = min(f[i + 1][j], f[i + 1][j + 1]) + triangle[i][j]
return f[0][0]

分析2:

如果使用O(n)的空间,算是加分点。于是优化分析1的空间,仅仅使用一维数组f,长度为len(triangle).

代码2:

class Solution(object):
def minimumTotal(self, triangle):
"""
:type triangle: List[List[int]]
:rtype: int
"""
t_len = len(triangle)
f = [0] * t_len
for i in range(t_len):
f[i] = triangle[t_len - 1][i]
for i in range(t_len - 2, -1, -1):
for j in range(i + 1):
f[j] = min(f[j], f[j + 1]) + triangle[i][j]
return f[0]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  DP leetcode Triangle