【代码随想录算法训练营第三十九天|62.不同路径、63.不同路径II、343.整数拆分、96.不同的二叉搜索树】

文章目录

62.不同路径

dp是每个各自的路径的和,每个格子的路径是左边格子和上边格子的和。这里初始化的时侯假设所有格子都只有一条路径,然后遍历所有格子,如果i-1和j-1大于0则可以把对应格子的值加上。

python 复制代码
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1 for _ in range(n)] for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if i > 0 and j > 0:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
                elif i > 0:
                    dp[i][j] = dp[i-1][j]
                elif j > 0:
                    dp[i][j] = dp[i][j-1]
        return dp[-1][-1]

63.不同路径II

和上一题相比如果格子有阻挡把他赋值为0,别的一样。

python 复制代码
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[1 for _ in range(n)] for _ in range(m)]
        for i in range(m):
            for j in range(n):
                if obstacleGrid[i][j]:
                    dp[i][j] = 0
                else:
                    if i > 0 and j > 0:
                        dp[i][j] = dp[i-1][j] + dp[i][j-1]
                    elif i > 0:
                        dp[i][j] = dp[i-1][j]
                    elif j > 0:
                        dp[i][j] = dp[i][j-1]
        return dp[-1][-1]

343.整数拆分

dp表示的是数字i的最大的整数拆分值,用for对每一个i再拆分成两个数字,递推公式是在dpi和j*(i-j)和j*dpi-j中选最大的,第一个是记录当前的最大整数拆分值,第二个是这个数字i在减去j拆分成两个数字的乘积,第三项是j和(i-j)的最大整数拆分的乘积(包括了拆分成多个数字的可能性)。

python 复制代码
class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [1 for _ in range(n+1)]
        for i in range(3, n+1):
            for j in range(1, i):
                dp[i] = max(dp[i], j * (i - j), dp[i-j]*j)
        return dp[n]

96.不同的二叉搜索树

dp内容是值为i的时候的二叉搜索树的可能个数,值为i时,他可能的二叉搜索树是从1到i的所有元素作为根节点的树相加的,对于每一个作为根节点的元素j,他的可能搜索二叉树由小于j的元素j-1的dp值构成左子树,由大于j的元素i-j的dp值构成右子树,则根节点为j的树的dp值为左右子树的dp值相乘。

python 复制代码
class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0] * (n+1)
        dp[0] = 1
        for i in range(1, n+1):
            for j in range(1,i+1):
                dp[i] += dp[j-1] * dp[i-j]
        return dp[-1]
相关推荐
我找到地球的支点啦5 小时前
Matlab系列(009) 一CRC循环冗余校验详解
开发语言·数据结构·算法·matlab·信息与通信
罗西的思考5 小时前
【OpenClaw具身硬件】ZeroClaw 源码阅读笔记(3)--- RAG
人工智能·算法·机器学习
浪里镖客6 小时前
位姿转换矩阵写法-个人习惯(计算机理解其实是相反的)
线性代数·算法·矩阵
小白羊丨9 小时前
如何诊断 Prompt 模板导致的效果下降?
人工智能·算法·prompt
OPEN-F10 小时前
C++11/14新特性精讲:移动语义与智能指针实战
开发语言·c++·算法
lisin-lee-cooper10 小时前
【leetcode658】有序数组找出k个最接近x的数
java·数据结构·算法
sunburn-10 小时前
Java堆(Heap)详解与实战教学
java·开发语言·数据结构·ide·算法
智碳能碳管理平台11 小时前
工业能耗台账标准化:能碳管理系统的数据口径怎么设计
算法·能碳管理系统·智碳能碳管理平台·企业能碳管理系统·碳排放核算软件·绿色工厂申报saas·能碳管理平台
带多刺的玫瑰11 小时前
Leecode#15刷题之三数之和
算法·leetcode·职场和发展
哭泣方源炼蛊11 小时前
并查集进阶 P1(带权并查集,并查集分类)
数据结构·c++·算法·二进制·带权并查集