首页 > 编程语言 >代码随想录算法训练营第三十四天|LC62.不同路径|LC63.不同路径Ⅱ

代码随想录算法训练营第三十四天|LC62.不同路径|LC63.不同路径Ⅱ

时间:2024-12-17 10:57:18浏览次数:7  
标签:__ obstacleGrid int 路径 随想录 第三十四 range dp

62. 不同路径 - 力扣(LeetCode)

①确定dp数组以及下标的含义:

        dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

②确定递推公式:

        像要求dp[i][j],只能有两个方向来推导出来,即dp[i - 1][j] 和 dp[i][j - 1];此时在回顾一下 dp[i - 1][j] 表示啥,是从(0, 0)的位置到(i - 1, j)有几条路径,dp[i][j - 1]同理。那么很自然,dp[i][j] = dp[i - 1][j] + dp[i][j - 1],因为dp[i][j]只有这两个方向过来。

③dp数组如何初始化;

        首先dp[i][0]一定都是1,因为从(0, 0)的位置到(i, 0)的路径只有一条,那么dp[0][j]也同理

④确定遍历顺序;

        递推公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1],dp[i][j]都是从其上方和左方推导而来,那么从左到右一层一层遍历就可以了。

⑤举例推导dp数组;

from typing import List
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[0] * n for _ in range(m)]
        # 设置第一列
        for i in range(m):
            dp[i][0] = 1
        # 设置第一行
        for i in range(n):
            dp[0][i] = 1

        # 计算每一个单元格的路径数量
        for i in range(1, m):
            for j in range(1, n):
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        # 索引在位置[m-1][n-1]
        return dp[m-1][n-1]

if __name__ == '__main__':
    m = 3
    n = 7
    res = Solution().uniquePaths(m, n)
    print(res)

63. 不同路径 II - 力扣(LeetCode)

        本题与上题LC62相比,就是多了一个障碍,但是没有障碍的我们上题已经分析过,对于有障碍的位置,就是对该位置进行标记,保持初始值(0)就可以了。 

①确定dp数组以及下标的含义:

       dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。

②确定递推公式:

        递推公式和62.不同路径一样,dp[i][j] = dp[i - 1][j] + dp[i][j - 1]。

        但是由于存在障碍,(i, j)如果就是障碍的话应该就保持初始状态(初始状态为0)

③dp数组如何初始化;

        从(0, 0)的位置到(i, 0)的路径只有一条,所以dp[i][0]一定为1,dp[0][j]也同理。

④确定遍历顺序;

       从递归公式dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 中可以看出,一定是从左到右一层一层遍历,这样保证推导dp[i][j]的时候,dp[i - 1][j] 和 dp[i][j - 1]一定是有数值。

⑤举例推导dp数组;

from typing import List
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        # 网格的行数
        m = len(obstacleGrid)
        # 网格的列数
        n = len(obstacleGrid[0])
        # 如果起点或者终点有障碍物,直接返回0
        if obstacleGrid[m-1][n-1] == 1 or obstacleGrid[0][0] == 1:
            return 0
        # 创建一个二维列表用于存数路径数
        dp = [[0]*n for _ in range(m)]

        # 设置起点的路径数为1
        dp[0][0] = 1 if obstacleGrid[0][0] == 0 else 0

        # 计算第一列的路径
        for i in range(1, m):
            if obstacleGrid[i][0] == 0:
                dp[i][0] = dp[i-1][0]

        # 计算第一行的路径
        for j in range(1, n):
            if obstacleGrid[0][j] == 0:
                dp[0][j] = dp[0][j-1]
        # 计算其他位置的路径数
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 1:
                    continue
                dp[i][j] = dp[i-1][j] + dp[i][j-1]
        # 终点返回路径数
        return dp[m-1][n-1]

if __name__ == '__main__':
    obstacleGrid = [[0, 0, 0], [0, 1, 0], [0, 0, 0]]
    res = Solution().uniquePathsWithObstacles(obstacleGrid)
    print(res)

标签:__,obstacleGrid,int,路径,随想录,第三十四,range,dp
From: https://blog.csdn.net/weixin_49494409/article/details/144478199

相关文章

  • 转型提升薪路径:新中地GIS开发特训营(08期),24年最后一期!
    25年的就业市场会好起来么?预计明年毕业生规模预计达1222万人,这一庞大的数字背后,其实就是明年愈发严峻的就业形势的。岗位需求与求职者数量之间的巨大差距,使得竞争变得异常激烈。如今的就业市场,岗位需求增长缓慢,而求职者却源源不断。一方面,经济形势的不稳定导致企业招聘更......
  • P5773 [JSOI2016] 轻重路径 题解
    Description在二叉树上,不断删除叶子,你要维护其重链剖分后重儿子编号和。如果两个孩子大小相同,在一开始连向左儿子,后面保持修改前的连接。\(n\leq2\times10^5\)。Solution考虑把一个叶子\(x\)删掉会对改变哪些点的重儿子。首先改变的点\(y\)一定在\(x\)到根的链上,同时......
  • 代码随想录:滑动窗口最大值
    代码随想录:滑动窗口最大值用双端队列写一个单调队列classSolution{public:classbiggerqueue{public:deque<int>target;//intwindows_size;//biggerqueue(intsize){windows_size=size;}//全错了,不能用size来pop掉......
  • 代码随想录:前K个高频元素
    代码随想录:前K个高频元素这个逼优先队列是真不好写啊。代码从上到下说吧,首先是map,原来这个map能用索引啊,map[i],i即指的键值,而且默认键值对的值是0。然后说这个优先队列,我只能说以后不想叫这玩意儿队列,因为这玩意儿一来不是个队列,一般是vector做底层,二来使用规范和queue也不一样......
  • 代码随想录算法训练营第四十八天|739.每日温度、496.下一个更大元素、503.下一个更大
    1leetcode739.每日温度题目链接:739.每日温度-力扣(LeetCode)文章链接:代码随想录视频链接:单调栈,你该了解的,这里都讲了!LeetCode:739.每日温度哔哩哔哩bilibili思路:就真的是暴力搜索来写这道题目,但是呢,有些示例里面就超时了,至少有点思路了吧,也算是好消息1.1自己的方法能......
  • 代码随想录算法训练营第四十六天|leetcode647. 回文子串、leetcode516.最长回文子序列
    1leetcode647.回文子串题目链接:647.回文子串-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划,字符串性质决定了DP数组的定义|LeetCode:647.回文子串哔哩哔哩bilibili思路:嘿,看不懂有一点,看解析吧1.1视频后的方法其实看完视频以后,感觉这个题目真的不难,我想到了二维......
  • 代码随想录算法训练营第四十五天|leetcode115.不同的子序列、leetcode583. 两个字符串
    1leetcode115.不同的子序列题目链接:115.不同的子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划之子序列,为了编辑距离做铺垫|LeetCode:115.不同的子序列哔哩哔哩bilibili思路:确实看不懂题目,还是看解析吧1.1视频后的方法有一种我看了视频,也没有那么理解是为......
  • 代码随想录算法训练营第四十四天|leetcode1143.最长公共子序列、leetcode1035.不相交
    1leetcode1143.最长公共子序列题目链接:1143.最长公共子序列-力扣(LeetCode)文章链接:代码随想录视频链接:动态规划子序列问题经典题目|LeetCode:1143.最长公共子序列哔哩哔哩bilibili思路:其实我比较清楚的是和上面一道题目的思路,差不太多,但是我不知道非连续的位置应该如何......
  • 深度解密企业培训10强:从技术革新到业务落地的实战路径
    如何选取优质的企业培训机构合作伙伴,为企业内部的人才成长与业务升级提供有力支撑。这个选择过程从来不止是简单的“一次采购”或“临时救火”,而更像是长期的、动态演进的人才战略布局——无论是聚焦高管层的战略认知升级,还是面向业务一线的专业技能赋能,企业培训已不再是边缘附......
  • 虚拟电厂参与市场的步骤及路径
    12月5日,国家能源局发布的关于支持电力领域新型经营主体创新发展的指导意见,明确鼓励虚拟电厂聚合分布式光伏、分散式风电、新型储能、可调节负荷等资源,为电力系统提供灵活调节能力。那么,虚拟电厂如何参与市场呢?以下是其参与市场的具体步骤及路径:(1)注册与资质审核      ......