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

embedded/2025/3/3 17:46:21/

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]*nfor 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:breakdata[i][0] = 1for j in range(n):if obstacleGrid[0][j] == 1:breakdata[0][j] = 1for 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:breakdata[j] = 1for i in range(1,m):for j in range(n):if obstacleGrid[i][j] == 1:data[j] = 0elif 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] = 1for 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] = 1for i in range(2,n+1):for j in range(0,i):dp[i] += dp[j]*dp[i-j-1]return dp[-1]

http://www.ppmy.cn/embedded/169674.html

相关文章

【OpenCV C++】图像清晰度增强:拉普拉斯锐化,SUM锐化,普通锐化

文章目录 1 普通锐化2. 拉普拉斯 锐化3 SUM锐化1 普通锐化 void sharpenImage(const cv::Mat& frame,float a, float b) {定义一个3x3的锐化核cv

算法日记33:15届蓝桥C++B组R格式(快速幂50%/高精度100%)

一、题目 二、题解一:快速幂(50%样例) 1、解题思路: 1)通过题目我们可以采取最朴素的想法就是先模拟题目的说明 2)并且我们发现有乘方出现( ∗ 2 n *2^n ∗2n),因此我们可以考虑使用快速幂来…

计算机视觉 |解锁视频理解三剑客——SlowFast

一、引言 在如今这个信息爆炸的时代,视频数据呈指数级增长,从日常的社交媒体分享,到安防监控的海量记录,再到智能驾驶中的环境感知,视频无处不在。视频理解作为计算机视觉领域的关键研究方向,旨在让计算机…

Sentinel入门

1.侵入式的方式 侵入式的代码如下,用SphU.entry定义要限制的业务逻辑 package com.hamster.sentineldemo;import com.alibaba.csp.sentinel.Entry; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.slots.block.BlockException; import c…

每天一个Flutter开发小项目 (9) : Flutter状态管理进阶 - Provider构建你的简易购物车应用

引言 欢迎再次回到 每天一个Flutter开发小项目 系列博客! 在前八篇博客中,我们已经系统学习了 Flutter UI 构建、用户交互、路由导航、数据持久化,以及网络请求等一系列关键技能。 您已经具备了构建功能较为全面的 Flutter 应用的能力。 随着应用功能的日益复杂,页面和组…

EasyRTC嵌入式WebRTC技术与AI大模型结合:从ICE框架优化到AI推理

实时通信技术在现代社会中扮演着越来越重要的角色,从视频会议到在线教育,再到远程医疗,其应用场景不断拓展。WebRTC作为一项开源项目,为浏览器和移动应用提供了便捷的实时通信能力。而EasyRTC作为基于WebRTC的嵌入式解决方案&…

阿里云AccessKey泄露以及nacos1.4.2漏洞修复

起因:每隔一段时间阿里云就会报AccessKey泄露了,但是并没有在代码中写AccessKey,后来发现在nacos中多了个新用户,是之前没有添加过的 排查: 1.检查是否开启了鉴权 查看配置文件application.properties # 是否开启授…

分布式事物在RocketMQ中的应用

RocketMQ 4.3 版本之后提供了对分布式事务消息的支持,它采用了一种类似于两阶段提交(2PC)的机制,但又有所不同,可以实现最终一致性的分布式事务。RocketMQ 的事务消息主要用于解决生产者发送消息和本地事务的原子性问题…