当前位置: 首页 > news >正文

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

62. 不同路径

题目链接: 62. 不同路径 - 力扣(LeetCode)

代码

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[1]*n for _ in range(m)]
        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[-1][-1]

优化时间复杂度

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [1]*n
        for i in range(1,m):
            for j in range(1,n):
                dp[j] += dp[j-1]
        return dp[-1]

63. 不同路径 II

题目链接: 63. 不同路径 II - 力扣(LeetCode)

思路

  1. dp[i][j] :表示从(0 ,0)出发,到(i, j) 有dp[i][j]条不同的路径。
  2. 代码实现:不要忽略第一行和第一列有可能出现障碍的情况

代码

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        # 初始状态
        data = [[0]*n for _ in range(m)]
        # 状态转移方程式
        for i in range(m):
            if obstacleGrid[i][0] == 1:
                break
            data[i][0] = 1
        for j in range(n):
            if obstacleGrid[0][j] == 1:
                break
            data[0][j] = 1
        
        for i in range(1,m):
            for j in range(1,n):
                if obstacleGrid[i][j] == 0:
                    data[i][j] = data[i-1][j] + data[i][j-1]
        # 终止状态
        return data[-1][-1]

时间复杂度优化

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        # 初始状态
        data = [0]*n
        # 状态转移方程式
        for j in range(n):
            if obstacleGrid[0][j] == 1:
                break
            data[j] = 1
        
        for i in range(1,m):
            for j in range(n):
                if obstacleGrid[i][j] == 1:
                    data[j] = 0
                elif j != 0:
                    data[j] += data[j-1]
        # 终止状态
        return data[-1]

343. 整数拆分

题目链接: 343. 整数拆分 - 力扣(LeetCode)

思路

  1. dp[i]的含义是分拆数字i,可以得到的最大乘积为dp[i]
  2. 本题有点不太好想

代码

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[2] = 1
        for i in range(3,n+1):
            for j in range(1,i):
                # j * (i - j) 是单纯的把整数拆分为两个数相乘,而j * dp[i - j]是拆分成两个以及两个以上的个数相乘。
                dp[i] = max(dp[i],j*dp[i-j],j*(i-j))
        return dp[-1]

96. 不同的二叉搜索树

题目链接: 96. 不同的二叉搜索树 - 力扣(LeetCode)

思路

  1. dp[i]的含义是n 个值互不相同的节点组成的二叉搜索树的个数
  2. 本题难点就是确定递推公式
  3. 递推关系可以从图中简单看出在这里插入图片描述

代码

class Solution:
    def numTrees(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[0] = 1 #为了方便计算
        dp[1] = 1
        for i in range(2,n+1):
            for j in range(0,i):
                dp[i] += dp[j]*dp[i-j-1]
        return dp[-1]

相关文章:

  • I/O函数
  • 【vue-echarts】——05.柱状图
  • 从Aurora看Xanadu可扩展模块化光量子计算机的现状与未来展望
  • 设计模式Python版 观察者模式
  • 零基础安装并搭建QT的环境以及QT开发工具
  • 授权与认证之jwt(五)创建Aop切面类
  • HashMap与HashTable的区别
  • 使用【华为手机】给吉利车机升级安装第三方软件教程【保姆级教程】
  • 高频 SQL 50 题(基础版)_1193. 每月交易 I
  • win32汇编环境,窗口程序使用树形视图示例一
  • Memcached监控本机内存(比redis速度更快)
  • 浙大 DeepSeek 线上课学习笔记
  • 时态知识图谱中的补全过滤策略(过滤损坏四元组)
  • 安装第三方软件报错:Called RunScript when not marked in progress
  • 绪论(4)
  • WPF 复杂页面布局及漂亮 UI 界面设计全解析
  • 基于python的网络爬虫爬取天气数据及可视化分析(Matplotlib、sk-learn等,包括ppt,视频)
  • SpringBoot高校运动会管理系统 附带详细运行指导视频
  • 动态规划 ─── 算法5
  • Kubespray部署企业级高可用K8S指南
  • 南宁小程序定制开发公司/南山网站seo
  • 模板网站什么意思/抖音代运营收费详细价格
  • 网站源码下载教程/关键词查询工具软件
  • 做网站开发学什么语言/国际站seo优化是什么意思
  • 网站促销活动策划/最近比较火的关键词
  • 网站开发和c语言/上海seo排名