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]
posted @ 2016-11-21 10:37  Salmd  阅读(118)  评论(0)    收藏  举报