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
The minimum path sum from top to bottom is
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]
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]
相关文章推荐
- 基于Android中dp和px之间进行转换的实现代码
- Android中dip、dp、sp、pt和px的区别详解
- LFC1.0.0 版本发布
- leetcode 179 Largest Number
- leetcode 24 Swap Nodes in Pairs
- leetcode 2 Add Two Numbers 方法1
- leetcode 2 Add Two Numbers 方法2
- Android px、dp、sp之间相互转换
- [LeetCode]47 Permutations II
- [LeetCode]65 Valid Number
- [LeetCode]123 Best Time to Buy and Sell Stock III
- [LeetCode] String Reorder Distance Apart
- [LeetCode] Sliding Window Maximum
- [LeetCode] Find the k-th Smallest Element in the Union of Two Sorted Arrays
- [LeetCode] Determine If Two Rectangles Overlap
- [LeetCode] A Distance Maximizing Problem
- leetcode_linearList
- leetcode_linearList02
- refereed to as “triangle
- css简单实现三角形箭头