【Day29】LeetCode:62. 不同路径,63. 不同路径 II,343. 整数拆分,96. 不同的二叉搜索树

文章目录

  • [LeetCode:62. 不同路径](#LeetCode:62. 不同路径)
  • [LeetCode:63. 不同路径 II](#LeetCode:63. 不同路径 II)
  • [LeetCode:343. 整数拆分](#LeetCode:343. 整数拆分)
  • [LeetCode:96. 不同的二叉搜索树](#LeetCode:96. 不同的二叉搜索树)

LeetCode:62. 不同路径

https://leetcode.cn/problems/unique-paths/description/

思路

第一行和第一列单独处理。
dp[i][j] = dp[i][j-1] + dp[i-1][j] .

解答

python 复制代码
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        dp = [[None for _ in range(n)] for _ in range(m)]

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

        return dp[m-1][n-1]

LeetCode:63. 不同路径 II

https://leetcode.cn/problems/unique-paths-ii/description/

思路

第一行和第一列单独处理。

如果当前位置没有石头:dp[i][j] = dp[i][j-1] + dp[i-1][j]

如果当前位置有石头:dp[i][j] = 0

解答

python 复制代码
class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        m = len(obstacleGrid)
        n = len(obstacleGrid[0])
        dp = [[None for _ in range(n)] for _ in range(m)]

        row = 0
        while row < m: # 处理第一列
            if obstacleGrid[row][0] == 0: # 第一列没有遇到石头
                dp[row][0] = 1
            else: # 遇到石头就退出
                break
            row += 1

        while row < m: # 第一列剩下的都变0
            dp[row][0] = 0
            row += 1

        col = 0
        while col < n: # 同理,处理第一行
            if obstacleGrid[0][col] == 0:
                dp[0][col] = 1
            else:
                break
            col += 1

        while col < n:
            dp[0][col] = 0
            col += 1

        # 处理剩下的格子
        for i in range(1, m):
            for j in range(1, n):
                if obstacleGrid[i][j] == 0: # 如果当前位置没有石头
                    dp[i][j] = dp[i][j-1] + dp[i-1][j]
                else: # 如果当前位置有石头
                    dp[i][j] = 0

        return dp[m-1][n-1]

LeetCode:343. 整数拆分

https://leetcode.cn/problems/integer-break/description/

思路

  1. 对于固定份数 k,乘积最大化的拆分是使各数尽可能相等。
    当给定若干个正整数的和固定时,这些数越接近,它们的乘积越大。因此,对于整数拆分,将 n 分成 k 份,最优策略是让各份尽可能平均。
  2. 乘积随份数 k 的变化先增后减
    当 k 较小时,增加份数可以避免出现大的数,乘积会增大;但当 k 过大时,份数中会出现很多 1,乘积反而下降。因此,乘积关于 k 是单峰的,可以提前终止。

解答

python 复制代码
class Solution:
    def integerBreak(self, n: int) -> int:
        results = []
        for k in range(2, n + 1):
            nums = [n // k] * k # 尽可能平均分成k份
            remain = n % k # 平均分完后剩余的数字
            for i in range(len(nums)): # 将剩余的数字平均分配
                if remain > 0:
                    nums[i] += 1
                    remain -= 1
                else:
                    break
            total = 1
            for num in nums:
                total *= num
            results.append(total)
            if len(results) >= 2 and results[-1] < results[-2]: # 如果出现递减,则后续不用再看
                break
        
        return max(results)

LeetCode:96. 不同的二叉搜索树

https://leetcode.cn/problems/unique-binary-search-trees/

思路

dp[i] += dp[j - 1] * dp[i - j] ,j - 1 为 j 为头结点左子树节点数量,i - j 为以 j 为头结点右子树节点数量。

解答

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[n]
相关推荐
我命由我12345几秒前
Python 开发 - Python 项目部署(Windows 与 Linux)
java·linux·windows·后端·python·java-ee·python3.11
Zella折耳根16 分钟前
实验2进阶版数据看板的设计与实现
python
Rain的Java大神之路18 分钟前
面了上百人,我最爱问的LeetCode 1「两数之和」:能背代码的很多,能讲清“先查后存”的没几个
java·后端·算法
databook25 分钟前
让 LLM 输出不再失控:用 Pydantic 校验大模型输出
人工智能·python·llm
jingcairensheng26 分钟前
vscode 配置Python虚拟环境基于扩展和原生miniconda的区别
ide·vscode·python
“AI国潮设计-小江”36 分钟前
《【AIGC实战】Python+SDXL批量生成“英歌舞草莓抱抱卷蛋糕”IP插牌立牌方案,锁定角色一致性,甜品插件化落地》
开发语言·人工智能·python·prompt·aigc
LMT流氓兔36 分钟前
第五单元——第7课:工具读取用户身份,而不是让模型填写身份
python·langchain
Ivanqhz37 分钟前
超参数考量与设计
数据库·人工智能·深度学习·算法·机器学习
雪落漂泊37 分钟前
C++算法 滑动窗口篇(上)
开发语言·c++·算法
FlyWIHTSKY40 分钟前
Agent阶段一:基础夯实
python·ai·fastapi