代码随想录算法训练营第36天 |不同路径、不同路径II、整数拆分

1、不同路径

class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        #初始化dp
        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[m-1][n-1]

2、不同路径II

class Solution:
    def uniquePathsWithObstacles(self, obstacleGrid: List[List[int]]) -> int:
        if not obstacleGrid or not obstacleGrid[0]:
            return 0
        dp = [[0] * len(obstacleGrid[0]) for _ in range(len(obstacleGrid))]
        #初始化第0行和第0列的dp
        for i in range(len(dp)):
            if obstacleGrid[i][0] == 1:
                break
            dp[i][0] = 1
        for i in range(len(dp[0])):
            if obstacleGrid[0][i] == 1:
                break
            dp[0][i] = 1
        #从第一行第一列开始遍历dp
        for i in range(1,len(dp)):
            for j in range(1,len(dp[0])):
                # 如果遇到障碍格子,或者被障碍格包围了,continue
                if obstacleGrid[i][j] == 1:
                    continue
                if obstacleGrid[i-1][j] == 1 and obstacleGrid[i][j-1] == 1:
                    continue
                #一边是障碍格子的情况
                elif obstacleGrid[i-1][j] == 1:
                    dp[i][j] = dp[i][j-1]
                elif obstacleGrid[i][j-1] == 1:
                    dp[i][j] = dp[i-1][j]
                #旁边没有障碍的情况
                else:
                    dp[i][j] = dp[i-1][j] + dp[i][j-1]
        return dp[-1][-1]

3、整数拆分

class Solution:
    def integerBreak(self, n: int) -> int:
        dp = [0]*(n+1)
        dp[2] = 1
        # 从3开始遍历到n
        for i in range(3,n+1):
            for j in range(2,i//2+2): # i//2+2表示i//2向上取整(+1),并且是<=(再+1)

                # max中,第一项表示拆成两个数相乘的值,第二项表示拆成多个数相乘的值
                # 第三项保证每个循环遍历的时候都能取到最大值
                dp[i] = max(j * (i-j), j*dp[i-j], dp[i])
        return dp[n]

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值