Unique Paths

题目非常简单,没有什么需要讨论的,主要是练习空间优化

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if not m and not n:
            return 0

        dp = [1] * m
        for i in xrange(1, n):
            for j in xrange(1, m):
                dp[j] += dp[j - 1]
        return dp[m - 1]

此题还有一个数学方法,我们走到最下角的时候必定横向走了n-1步,纵向走了m-1步,所以最后结果就是Cn + m - 2/n - 1,变成了一个单纯排列组合的问题了

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        if n == 1 or m == 1:
            return 1

        total = reduce(operator.mul, range(1, n + m - 1))
        left = reduce(operator.mul, range(1, n))
        right = reduce(operator.mul, range(1, m))
        return total / (left * right)

Unique Paths II

加了一个障碍的判断逻辑,其他没有区别,下面是无优化版本的

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        n = len(obstacleGrid)
        if not n:
            return 0

        m = len(obstacleGrid[0])
        if not m:
            return 0

        dp = [[0] * m for _ in xrange(n)]
        dp[0][0] = 1 if obstacleGrid[0][0] != 1 else 0

        for i in xrange(1, n):
            dp[i][0] = dp[i - 1][0] if obstacleGrid[i][0] != 1 else 0

        for j in xrange(1, m):
            dp[0][j] = dp[0][j - 1] if obstacleGrid[0][j] != 1 else 0

        for i in xrange(1, n):
            for j in xrange(1, m):
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1] if obstacleGrid[i][j] != 1 else 0

        return dp[n - 1][m - 1]

Minimum Path Sum

这道题实际上思维和上面两道是一样的,只不过换成求最小和了而已,下面是无优化版本的

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        n = len(grid)
        if not n:
            return 0

        m = len(grid[0])
        if not m:
            return 0

        dp = [[0] * m for _ in xrange(n)]
        dp[0][0] = grid[0][0]

        for i in xrange(1, m):
            dp[0][i] = dp[0][i - 1] + grid[0][i]
        for i in xrange(1, n):
            dp[i][0] = dp[i - 1][0] + grid[i][0]

        for i in xrange(1, n):
            for j in xrange(1, m):
                dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j]

        return dp[n - 1][m - 1]

results matching ""

    No results matching ""