代码随想录第39天 | 62.不同路径 、 63. 不同路径 II

这篇具有很好参考价值的文章主要介绍了代码随想录第39天 | 62.不同路径 、 63. 不同路径 II。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、前言

参考文献:代码随想录

今天主要的题目是动态规划的路径问题,动态规划五要点;

1、确定dp数组,dp[i]代表什么i代表什么;

2、递推公式;

3、初始化dp数组;

4、遍历顺序;

5、打印dp数组;

二、不同路径

1、思路:

我感觉动态规划,我听的很认真,然后这个题目,我有一点感觉,但是我又想不出来,只好去求看一下卡哥,但是才看了三分钟,我就想到思路了。。。

(1)dp数组,由于这是一个二维图,所以需要创建一个二维的dp数组,i,j分别代表一个点位,dp[i][j]代表到达该点的位置;

(2)初始化:我们发现,机器人只允许向右或者向下移动,所以在[i][0]上面的情况全是1,以及[0][j]也全是1,所以这就是初始化;

(3)递推公式:

当我把图画出来后不难发现当需要拐弯时,那个结点的情况就是上面的路径加上左边的路径;代码随想录第39天 | 62.不同路径 、 63. 不同路径 II,leetcode,算法

(图很潦草)但是也能看懂,所以递推公式就是:

dp[i][j] = dp[i - 1][j] + dp[i][j - 1];

(4)遍历顺序:很显然,我们是要慢慢的积累我们不同路径的数量,所以是从最小的地方开始,但是不是用上边界和左边界,而是从[1][1]的地方开始;

2、整体代码如下:

class Solution {
public:
    int uniquePaths(int m, int n) {
        // 1、定义dp数组,i,j表示位置,dp[i][j]表示到达结点的次序
        vector<vector<int>> dp(m, vector<int>(n));
        // 2、初始化dp数组
        for (int i = 0; i < m; i++) {
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            dp[0][j] = 1;
        }
        // 3、遍历
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 4、递推公式
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        // 5、打印dp数组
        // for (int i = 0; i < m; i++) {
        //     for (int j = 0; j < n; j++) {
        //         cout << dp[i][j] << " ";
        //     }
        //     cout << endl;
        // }
        return dp[m - 1][n - 1];
    }
};

三、不同路径||

1、思路:

这个题目和上一个不同路径的题目思路差不多,但是其中多了障碍物,所以在递推公式上,我们就得分很多种情况,来做出不同的措施;

(1)dp数组,与上一个题目的作用相同;

(2)初始化,这里的初始化就有一些区别。因为在初始化上边界和左边界时可能会出现障碍物,一旦出现,就需要把后面的路径数设置为0:

        for (int i = 0; i < m; i++) {
            if (obstacleGrid[i][0] == 1) {
                for (int j = i; j < m; j++) {
                    dp[i][0] = 0;
                }
                break;
            }
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            if (obstacleGrid[0][j] == 1) {
                for (int i = j; i < n; i++) {
                    dp[0][j] = 0;
                }
                break;
            }
            dp[0][j] = 1;
        }

(3)递推公式:在递推公式中,我们需要做出以下几种情况的判断,

1、如果当前[i][j]位置有障碍物,则直接设置为0;

2、如果上方有障碍物,左边没有:则只累加左边的pd[i - 1][j]数组的值 ;

3、相反,则只累加上方dp[i][j - 1];

4、同时出现障碍物时,dp[i][j]设置为0;

5、没有障碍物,就正常相加;

(4)遍历顺序:

也是从[1][1]开始遍历,从浅带到深;

(5)打印dp数组(debug);

2、整体代码如下:

class Solution {
public:
    int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {
        // 获得行数和列数
        int m = obstacleGrid.size();
        int n = obstacleGrid[0].size();
        if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) return 0;
        // 1、确定dp数组,和上一题类似;
        vector<vector<int>> dp(m, vector<int>(n));
        // 2、同样的方法初始化
        for (int i = 0; i < m; i++) {
            if (obstacleGrid[i][0] == 1) {
                for (int j = i; j < m; j++) {
                    dp[i][0] = 0;
                }
                break;
            }
            dp[i][0] = 1;
        }
        for (int j = 0; j < n; j++) {
            if (obstacleGrid[0][j] == 1) {
                for (int i = j; i < n; i++) {
                    dp[0][j] = 0;
                }
                break;
            }
            dp[0][j] = 1;
        }
        // 3、遍历顺序
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                // 情况0:当前的坐标有障碍物
                if (obstacleGrid[i][j] == 1) {
                    dp[i][j] = 0;
                    continue;
                }
                // 情况1:左边出现障碍物
                if (obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j - 1] != 1) {
                    dp[i][j] = dp[i][j - 1];
                    // 情况2:上方出现障碍物
                } else if (obstacleGrid[i - 1][j] != 1 && obstacleGrid[i][j -1] == 1) {
                    dp[i][j] = dp[i - 1][j];
                    // 情况3:左右均有障碍物
                } else if (obstacleGrid[i - 1][j] == 1 && obstacleGrid[i][j -1] == 1){
                    dp[i][j] = 0;
                    // 情况4:没有障碍物
                } else {
                    dp[i][j] = dp[i][j - 1] + dp[i - 1][j];
                }
            }
        }
        // 5、打印dp数组
        // for (int i = 0; i < m; i++) {
        //     for (int j = 0; j < n; j++) {
        //         cout << dp[i][j] << " ";
        //     }
        //     cout << endl;
        // }
        return dp[m - 1][n - 1];
    }
};

今日学习时间:1.5小时;

 Nobody can stop me.

我无人可当!

 文章来源地址https://www.toymoban.com/news/detail-850275.html

 

 

到了这里,关于代码随想录第39天 | 62.不同路径 、 63. 不同路径 II的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • DAY39 62.不同路径 + 63. 不同路径 II

    题目要求:一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 根据“机器人每次只能向下或者向右移动一步”

    2024年02月07日
    浏览(35)
  • 算法Day39 | 62. 不同路径,63. 不同路径 II

    题目链接:62. 不同路径 dp[i][j] 结果为从起点到该点有多少路径。 递归公式: dp[i][j] = dp[i - 1][j] + dp[i][j - 1] 初始化:因为只能从上往下、从左往右走,因此最上侧,最左侧初始化为1(1种路径) 遍历顺序:从上往下,从左往右 也可以使用 滚动 (一维)数组。 其中 dp[j] 表示

    2024年02月10日
    浏览(36)
  • 算法D39 | 动态规划2 | 62.不同路径 63. 不同路径 II

    今天开始逐渐有 dp的感觉了,题目不多,就两个 不同路径,可以好好研究一下 62.不同路径  本题大家掌握动态规划的方法就可以。 数论方法 有点非主流,很难想到。  代码随想录 视频讲解: 动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩_bilibili 这个题看

    2024年04月10日
    浏览(37)
  • 算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

    Category Difficulty Likes Dislikes ContestSlug ProblemIndex Score algorithms Medium (67.70%) 1746 0 - - 0 Tags Companies 一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

    2023年04月25日
    浏览(34)
  • 代码随想录Day62

    今天继续学习单调栈解决相关问题。 nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。 给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。 对于每个 0 = i nums1.length ,找出满足 nums1

    2024年02月01日
    浏览(35)
  • 代码随想录| 图论04 查并集 ●查并集理论知识 ●1971.寻找图中是否存在路径 ●684.冗余连接 ●685.冗余连接II

    #查并集理论知识   并查集用处:解决连通性问题 将两个元素添加到一个集合中。 判断两个元素在不在同一个集合 思路:将三个元素A,B,C (分别是数字)放在同一个集合,其实就是将三个元素连通在一起,如何连通:只需要用一个一维数组来表示,即:father[A] = B,fathe

    2024年02月16日
    浏览(33)
  • LeetCode算法题解(动态规划)|LeetCoed62. 不同路径、LeetCode63. 不同路径 II

    题目链接:62. 不同路径 题目描述: 一个机器人位于一个  m x n   网格的左上角 (起始点在下图中标记为 “Start” )。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。 问总共有多少条不同的路径? 示例 1: 示例 2:

    2024年02月05日
    浏览(42)
  • Day39 代码随想录(1刷) 动态规划 0-1背包

    题目描述 小明是一位科学家,他需要参加一场重要的国际科学大会,以展示自己的最新研究成果。他需要带一些研究材料,但是他的行李箱空间有限。这些研究材料包括实验设备、文献资料和实验样本等等,它们各自占据不同的空间,并且具有不同的价值。  小明的行李空间

    2024年04月23日
    浏览(39)
  • 代码随想录:55. 跳跃游戏;45. 跳跃游戏 II

    给定一个非负整数数组  nums  ,你最初位于数组的  第一个下标  。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 示例 2: 其实跳几步无所谓,关键在于可跳的覆盖范围! 不一定非要明确一次究竟跳几步,每次取最

    2023年04月11日
    浏览(36)
  • 代码随想录 Leetcode142. 环形链表 II

            双指针解决百分之99的链表题

    2024年01月19日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包