代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II

简介: 代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II

代码随想录算法训练营第三十九天 | LeetCode 62. 不同路径、63. 不同路径 II

文章链接:不同路径        不同路径II

视频链接:不同路径        不同路径II

1. LeetCode 62. 不同路径

1.1 思路

  1. 本题是个二维矩阵,因此 dp 数组也定义为二维的,这样才能记录每个格的状态。从起始位置(0,0)到终止位置(m,n)
  2. dp 数组及下标的含义:dp[i][j] 的含义表示从(0,0)出发,到(i,j) 有dp[i][j]条不同的路径。
  3. 递推公式:由于只能向下和向右走,因此 dp[i][j]=dp[i-1][j]+dp[i][j-1]。还是和70. 爬楼梯一样,我们求的是方法数,不是步数,因此不用在这前两个位置的基础上+1。
  4. 初始化 dp 数组:因为中间那些格子需要从左方和上方推导出来的,因此左方和上方的格子都要初始化,即第 0 行和第 0 列,都初始化为 1 即可,因为我们只能往右和往下走,想走完第 0 行和第 0 列,只能一直向右和向下,都是 1 种路径
  5. 遍历顺序:从左往右,从上往下。因为需要依赖上方和左方的值
  6. 打印 dp 数组:用于 debug 验证

1.2 代码

//
/**
     * 1. 确定dp数组下标含义 dp[i][j] 到每一个坐标可能的路径种类
     * 2. 递推公式 dp[i][j] = dp[i-1][j] dp[i][j-1]
     * 3. 初始化 dp[i][0]=1 dp[0][i]=1 初始化横竖就可
     * 4. 遍历顺序 一行一行遍历
     * 5. 推导结果 。。。。。。。。
     *
     * @param m
     * @param n
     * @return
     */
    public static int uniquePaths(int m, int n) {
        int[][] dp = new int[m][n];
        //初始化
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        for (int i = 0; i < n; i++) {
            dp[0][i] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = dp[i-1][j]+dp[i][j-1];
            }
        }
        return dp[m-1][n-1];
    }

2. LeetCode 63. 不同路径 II

2.1 思路

  1. 本题和62. 不同路径的区别在于,在图上多了个障碍
  2. dp 数组及下标的含义:dp[i][j] 的含义表示从(0,0)出发,到(i,j) 有dp[i][j]条不同的路径。和62. 不同路径基本一样
  3. 递推公式:dp[i][j]=dp[i-1][j]+dp[i][j-1] 也是一样的,但是多了个障碍,有了障碍的位置就不能走了,即 if(obstacleGrid[i][j]==0)再进行递推公式dp[i][j]=dp[i-1][j]+dp[i][j-1]
  4. 初始化 dp 数组:这是和62. 不同路径的最大区别,上面是第 0 行和第 0 列都是全 1,但这里如果在第 0 行(列)某个位置有障碍,那么右(下)方的就不是 1 而是 0 了,因为走不到这个位置,因为是只能往下或者往右走
  5. 遍历顺序:从左往右,从上往下。因为需要依赖上方和左方的值
  6. 打印 dp 数组:用于 debug 验证
  7. 注意这里你没必要在上述基础上遍历 dp 数组时加个条件:如果上面有障碍就只加上左边的,如果左边有障碍的就只加上上边的。这个没必要的。因为在有障碍的地方跳过了不给 dp[i][j] 赋值了,那个位置的 dp[i][j] 是为 0 的,后面即使加上也没事。

2.2 代码

//
class Solution {
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {
        int m = obstacleGrid.length;
        int n = obstacleGrid[0].length;
        int[][] dp = new int[m][n];
        //如果在起点或终点出现了障碍,直接返回0
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) {
            return 0;
        }
        for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) {
            dp[0][j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;
            }
        }
        return dp[m - 1][n - 1];
    }
}
相关文章
|
14天前
|
算法
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
代码随想录算法训练营第六十天 | LeetCode 84. 柱状图中最大的矩形
19 3
|
14天前
|
算法
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
代码随想录算法训练营第五十七天 | LeetCode 739. 每日温度、496. 下一个更大元素 I
15 3
|
14天前
|
算法
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
代码随想录算法训练营第五十六天 | LeetCode 647. 回文子串、516. 最长回文子序列、动态规划总结
33 1
|
13天前
|
机器学习/深度学习 人工智能 算法
基于DCT和扩频的音频水印嵌入提取算法matlab仿真
本文介绍了结合DCT和扩频技术的音频水印算法,用于在不降低音质的情况下嵌入版权信息。在matlab2022a中实现,算法利用DCT进行频域处理,通过扩频增强水印的隐蔽性和抗攻击性。核心程序展示了水印的嵌入与提取过程,包括DCT变换、水印扩频及反变换步骤。该方法有效且专业,未来研究将侧重于提高实用性和安全性。
|
28天前
|
机器学习/深度学习 算法
【MATLAB】GA_BP神经网络时序预测算法
【MATLAB】GA_BP神经网络时序预测算法
35 8
|
3天前
|
算法 数据安全/隐私保护 计算机视觉
基于DCT变换的彩色图像双重水印嵌入和提取算法matlab仿真
**算法摘要:** - 图形展示:展示灰度与彩色图像水印应用,主辅水印嵌入。 - 软件环境:MATLAB 2022a。 - 算法原理:双重水印,转换至YCbCr/YIQ,仅影响亮度;图像分割为M×N块,DCT变换后嵌入水印。 - 流程概览:两步水印嵌入,每步对应不同图示表示。 - 核心代码未提供。
|
3天前
|
机器学习/深度学习 算法 数据可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
Matlab决策树、模糊C-均值聚类算法分析高校教师职称学历评分可视化
10 0
|
4天前
|
算法 TensorFlow 算法框架/工具
基于直方图的图像阈值计算和分割算法FPGA实现,包含tb测试文件和MATLAB辅助验证
这是一个关于图像处理的算法实现摘要,主要包括四部分:展示了四张算法运行的效果图;提到了使用的软件版本为VIVADO 2019.2和matlab 2022a;介绍了算法理论,即基于直方图的图像阈值分割,通过灰度直方图分布选取阈值来区分图像区域;并提供了部分Verilog代码,该代码读取图像数据,进行处理,并输出结果到&quot;result.txt&quot;以供MATLAB显示图像分割效果。
|
4天前
|
算法 搜索推荐 数据挖掘
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
MATLAB模糊C均值聚类FCM改进的推荐系统协同过滤算法分析MovieLens电影数据集
13 0
|
5天前
|
数据采集 机器学习/深度学习 存储
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
MATLAB用改进K-Means(K-均值)聚类算法数据挖掘高校学生的期末考试成绩
12 0

热门文章

最新文章