[Lintcode]115. Unique Paths II/[Leetcode]63. Unique Paths II

115. Unique Paths II/63. Unique Paths II

  • 本题难度: Easy/Medium
  • Topic: Dynamic Programming

Description

Follow up for "Unique Paths":

Now consider if some obstacles are added to the grids. How many unique paths would there be?

An obstacle and empty space is marked as 1 and 0 respectively in the grid.

Example
Example 1:
Input: [[0]]
Output: 1

Example 2:
Input: [[0,0,0],[0,1,0],[0,0,0]]
Output: 2

Explanation:
Only 2 different path.

Notice
m and n will be at most 100.

我的代码

class Solution:
    """
    @param obstacleGrid: A list of lists of integers
    @return: An integer
    """
    def uniquePathsWithObstacles(self, obstacleGrid):
        # write your code here
        n = len(obstacleGrid)
        m = len(obstacleGrid[0])
        res = [[0 for _ in range(m+1)] for _ in range(n+1)]
        if obstacleGrid[0][0] or obstacleGrid[-1][-1]:
            return 0
        else:
            res[1][1] = 1
        for i in range(1,n+1):
            for j in range(1,m+1):
                if j==1 and i==1:
                    continue
                if obstacleGrid[i-1][j-1]==0:
                    res[i][j]=res[i-1][j]+res[i][j-1]
                else:
                    res[i][j] = 0
                    
        return res[n][m]

别人的代码

https://leetcode.com/problems/unique-paths-ii/discuss/23410/Python-different-solutions-(O(m*n)-O(n)-in-place).

# O(m*n) space
def uniquePathsWithObstacles1(self, obstacleGrid):
    if not obstacleGrid:
        return 
    r, c = len(obstacleGrid), len(obstacleGrid[0])
    dp = [[0 for _ in xrange(c)] for _ in xrange(r)]
    dp[0][0] = 1 - obstacleGrid[0][0]
    for i in xrange(1, r):
        dp[i][0] = dp[i-1][0] * (1 - obstacleGrid[i][0])
    for i in xrange(1, c):
        dp[0][i] = dp[0][i-1] * (1 - obstacleGrid[0][i])
    for i in xrange(1, r):
        for j in xrange(1, c):
            dp[i][j] = (dp[i][j-1] + dp[i-1][j]) * (1 - obstacleGrid[i][j])
    return dp[-1][-1]
    
# O(n) space
def uniquePathsWithObstacles2(self, obstacleGrid):
    if not obstacleGrid:
        return 
    r, c = len(obstacleGrid), len(obstacleGrid[0])
    cur = [0] * c
    cur[0] = 1 - obstacleGrid[0][0]
    for i in xrange(1, c):
        cur[i] = cur[i-1] * (1 - obstacleGrid[0][i])
    for i in xrange(1, r):
        cur[0] *= (1 - obstacleGrid[i][0])
        for j in xrange(1, c):
            cur[j] = (cur[j-1] + cur[j]) * (1 - obstacleGrid[i][j])
    return cur[-1]

# in place
def uniquePathsWithObstacles(self, obstacleGrid):
    if not obstacleGrid:
        return 
    r, c = len(obstacleGrid), len(obstacleGrid[0])
    obstacleGrid[0][0] = 1 - obstacleGrid[0][0]
    for i in xrange(1, r):
        obstacleGrid[i][0] = obstacleGrid[i-1][0] * (1 - obstacleGrid[i][0])
    for i in xrange(1, c):
        obstacleGrid[0][i] = obstacleGrid[0][i-1] * (1 - obstacleGrid[0][i])
    for i in xrange(1, r):
        for j in xrange(1, c):
            obstacleGrid[i][j] = (obstacleGrid[i-1][j] + obstacleGrid[i][j-1]) * (1 - obstacleGrid[i][j])
    return obstacleGrid[-1][-1]

思路
类似于62. Unique Paths
参考的代码很好。第一是少了一个判断条件,直接用乘以(1-obstackeGrid[][])代替,二是节约了空间

posted @ 2019-02-16 15:16  siriusli  阅读(221)  评论(0编辑  收藏  举报