https://leetcode-cn.com/problems/unique-paths-ii/
# -*- coding:utf-8 -*- class Solution(object): def uniquePathsWithObstacles(self, obstacleGrid): """ :type obstacleGrid: List[List[int]] :rtype: int """ def is_available(x, y): """ 验证当前位置是否可达 :param x: :param y: :return: """ if x < len(obstacleGrid) and y < len(obstacleGrid[0]) and obstacleGrid[x][y] == 0: return True else: return False def dfs(x, y): """ 深度优先遍历 :param x: :param y: :return: """ if x == len(obstacleGrid) - 1 and y == len(obstacleGrid[0]) - 1: return 1 res = 0 for ii, jj in [(0, 1), (1, 0)]: if is_available(x + ii, y + jj): res += dfs(x + ii, y + jj) return res # if len(obstacleGrid) == 1: # if sum(obstacleGrid[0]) >= 1: # return 0 # return 1 if obstacleGrid[0][0] == 1: return 0 res = dfs(0, 0) return res if __name__ == '__main__': obta = [ [0, 0, 0], [0, 1, 0], [0, 0, 0] ] print(Solution().uniquePathsWithObstacles(obta))
思路:刚开始我想的是深搜,虽然能完成,但是超时了,那就dp呗。
dp的思路是先处理一行,如果当前位置是路障,则为0,否则为左和上的和。
建议采用多一行列的dp数组来统一化操作。
也可以使用优化内存的dp数组。dp代表当前行的相关信息,因为第一列总要和当前行的上一行一致(因为只能向下到这里),所以完全可以直接继续使用上一行的dp状态来计算下一行。
这里之所以dp初始化为m+1个就是要当j==0时j-1能够统一操作,放到[1]前面也一样
def uni(self, obstacleGrid):
m, n = len(obstacleGrid[0]), len(obstacleGrid)
dp = [1] + [0] * m
for i in range(0, n):
for j in range(0, m):
dp[j] = 0 if obstacleGrid[i][j] else dp[j] + dp[j - 1]
return dp[-2]
0 条评论