64. Minimum Path Sum
problem
Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.
Note: You can only move either down or right at any point in time.
- 二维动态规划问题
solution
建立一个等大小的数组,记录到每个格子的最小值
里面包含一些冗余计算,效率不高
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
num = 0
x = len(grid)
y = len(grid[0])
nums = [[0]*y for _ in range(x)]
for i in range(x):
for j in range(y):
nums[i][j] = grid[i][j] + min(nums[i][j-1] if j>0 else nums[i-1][j], nums[i-1][j] if i>0 else nums[i][j-1])
print nums
return nums[x-1][y-1]
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
INF = 0x7fffffff
if not len(grid):
return 0
width = len(grid[0]) + 1
dp = [INF for _ in xrange(width)]
for row in xrange(len(grid)):
dp[0] = 0 if not row else INF
for col in xrange(1, width):
dp[col] = min(dp[col], dp[col - 1]) + grid[row][col - 1]
return dp[width - 1]
第二个效率高很多,检查原因
-
不是xrange
-
改写移除部分if,无提升
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
num = 0
x = len(grid)
y = len(grid[0])
nums = [[0x7fffffff]*(y+1) for _ in range(x)]
nums[0][0] = 0
for i in xrange(x):
if i == 0:
for j in xrange(1,y+1):
nums[0][j] = min(nums[0][j], nums[0][j-1])+grid[0][j-1]
else:
for j in xrange(1,y+1):
nums[i][j] = min(nums[i-1][j], nums[i][j-1])+grid[i][j-1]
print nums
return nums[x-1][y]
- 差异只有nums是采用1维还是2维
nums[j] = min(nums[j], nums[j-1])+grid[i][j-1]
这句话是当前位置上面和左边元素比较,然后加当前元素
class Solution(object):
def minPathSum(self, grid):
"""
:type grid: List[List[int]]
:rtype: int
"""
num = 0
x = len(grid)
y = len(grid[0])
#nums = [[0x7fffffff]*(y+1) for _ in range(x)]
nums = [0x7fffffff]*(y+1)
#nums[0][0] = 0
for i in xrange(x):
nums[0] = 0 if 0 == i else 0x7fffffff
for j in xrange(1,y+1):
nums[j] = min(nums[j], nums[j-1])+grid[i][j-1]
print nums
return nums[y]

浙公网安备 33010602011771号