代码随想录27期|Python|Day39|​动态规划|62. 不同路径​|​63. 不同路径 II​

62. 不同路径

简单题。由于规定了只能走右边和下边,所以右下角的值等于左对角线的两数之和。

1、确定dp和下标:二维数组,i,j分别为行和列,dp值为所需步数;

2、 初始化:只有上边和左边全部初始化为1,其余都是0;

3、递推:根据(1)的递推方式给出。

本质上是一个二维数组遍历,双层for嵌套。

注意:复习一下二维空数组的初始化方式。

class Solution(object):
    def uniquePaths(self, m, n):
        """
        :type m: int
        :type n: int
        :rtype: int
        """
        dp = [[0]*n for _ in range(m)]

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

63. 不同路径 II​​​​​​​

在上一题的基础上多了一个判断:

1、对于上边和左边,如果存在障碍,则后续都不可达,退出赋值1的循环;

2、对于中间区域的障碍,视作0即可;

只需要在原来的代码基础上加入一个obstacle数组的同步判断即可。

class Solution(object):
    def uniquePathsWithObstacles(self, obstacleGrid):
        """
        :type obstacleGrid: List[List[int]]
        :rtype: int
        """
        m = len(obstacleGrid[0])
        n = len(obstacleGrid)
        dp = [[0] * m for _ in range(n)]
        if obstacleGrid[n-1][m-1] == 1 or obstacleGrid[0][0] == 1:
            return 0
        for i in range(m):
            if obstacleGrid[0][i] == 1:
                break
            else:
                dp[0][i] = 1

        for j in range(n):
            if obstacleGrid[j][0] == 1:
                break
            else:
                dp[j][0] = 1

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

        return dp[-1][-1]

Day39完结!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值