力扣刷题 day18:09-17

1.不同路径 II

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 1 和 0 来表示。力扣刷题 day18:09-17_第1张图片

方法一:动态规划 

#方法一:动态规划
def uniquePathsWithObstacles(obstacleGrid):
    dp=[[0]*len(obstacleGrid[0]) for i in range(len(obstacleGrid))]
    for i in range(len(obstacleGrid)):
        if obstacleGrid[i][0] ==1: #边界情况,要考虑是否有障碍物
            break
        dp[i][0]=1
    for i in range(len(obstacleGrid[0])):
        if obstacleGrid[0][i]==1:
            break
        dp[0][i]=1
    for i in range(1,len(obstacleGrid)):
        for j in range(1,len(obstacleGrid[0])):
            if obstacleGrid[i][j]==1: #如果遇到障碍物则dp[i][j]不变=0
                continue
            dp[i][j]=dp[i-1][j]+dp[i][j-1] #否则可以通过,等于左边和上边方法数之和
    return dp[-1][-1]

2.最小路径和

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明:每次只能向下或者向右移动一步。力扣刷题 day18:09-17_第2张图片

方法一:动态规划 

#方法一:动态规划
def minPathSum(grid):
    dp=[[0]*len(grid[0]) for i in range(len(grid))]
    dp[0][0]=grid[0][0] #初始值在原点
    for i in range(1,len(grid)):
        dp[i][0]=dp[i-1][0]+grid[i][0] #边界条件判定
    for i in range(1,len(grid[0])):
        dp[0][i]=dp[0][i-1]+grid[0][i] #只能是一直走一直加和
    for i in range(1,len(grid)):
        for j in range(1,len(grid[0])):
            dp[i][j]=min(dp[i-1][j],dp[i][j-1])+grid[i][j] #等于上一个和左边最小路径
    return dp[-1][-1]

3.解码方法

一条包含字母 A-Z 的消息通过以下映射进行了 编码 :

'A' -> "1"
'B' -> "2"
...
'Z' -> "26"
要 解码 已编码的消息,所有数字必须基于上述映射的方法,反向映射回字母(可能有多种方法)。例如,"11106" 可以映射为:

"AAJF" ,将消息分组为 (1 1 10 6)
"KJF" ,将消息分组为 (11 10 6)
注意,消息不能分组为  (1 11 06) ,因为 "06" 不能映射为 "F" ,这是由于 "6" 和 "06" 在映射中并不等价。

给你一个只含数字的 非空 字符串 s ,请计算并返回 解码 方法的 总数 。

题目数据保证答案肯定是一个 32 位 的整数。力扣刷题 day18:09-17_第3张图片

方法一:动态规划 

#方法一:动态规划
def numDecodings(s):
    n=len(s)
    s=' '+s #加上空格解决前导0的问题
    dp=[0 for i in range(n+1)]
    dp[0]=1
    for i in range(1,n+1):
        a=ord(s[i])-ord('0') #计算当前位置的值
        b=(ord(s[i-1])-ord('0'))*10+ord(s[i])-ord('0') #当前位置与前一个位置的值
        if 1<=a<=9:
            dp[i]=dp[i-1] #要么就是跟前面的相等
        if 10<=b<=26:
            dp[i]+=dp[i-2] #要么要加上能构成两位整数的情况
    return dp[n]

 

你可能感兴趣的:(力扣刷题,leetcode,算法,职场和发展)