爪哇2博客
爪哇2博客

计算从MxN矩阵的左上到右下的所有路径

在本文中,我们将了解如何计算MxN矩阵从左上到右下的所有路径。


问题

我们需要计算从MxN矩阵的左上角到右下角的所有路径。您可以向下或向右移动。

矩阵路径


您可以使用递归解决此问题。

递归

1
2
3
4
5
6
7
8
9
10
 
上市 整型 countMatrixPathsRec(整型 [][] 矩阵, 整型 , 整型 关口){
        //基本情况
        //如果到达最后一行或最后一列,则只有一条路可走
        如果(==矩阵.长度-1 || 关口==矩阵[0].长度-1){
            返回 1;
        }
        返回 countMatrixPathsRec(矩阵, +1, 关口) + countMatrixPathsRec(矩阵, , 关口+1);
    }
 

递归可以很好地工作,但是此解决方案的时间复杂度将是指数级的,因为这里有很多重叠的子问题。

我们可以使用动态编程来解决问题。我们赢了’t多次重新计算任何子问题。

动态编程

这是用于动态编程解决方案的简单算法。

  • 用矩阵初始化数组dp’的尺寸。一旦到达右下角,此数组将为我们提供最终计数。
  • 用1填充第一行,因为您可以从一个方向到达此处(向右移动)
  • 也请在第一列中填入1,因为您可以从一个方向到达此处(向下移动)。
  • 遍历所有其他行和列并使用公式 dp = dp [i-1] [j] + dp [i] [j-1],因为您可以从两个方向到达此处(向右或向下)
  • 返回 dp [matrix.length-1] [matrix [0] .length-1]

这是该算法的示意图。
矩阵路径DP

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
 
上市 整型 countMatrixPathsDynamicProgramming(整型 [][] 矩阵){
        整型 dp [][] = 整型[矩阵.长度][矩阵[0].长度];
 
 
        //第一行的路径数将为1,因为您只能沿一个方向移动
        对于 (整型 i = 0; i <dp .长度 ; i++) {
            dp [0][i] = 1;
        }
 
        //第一列的路径数将为1,因为您只能在一个方向上移动
        对于 (整型 i = 0; i <dp .长度 ; i++) {
            dp [i][0] = 1;
        }
 
        对于 (整型 i = 1; i <dp .长度 ; i++) {
            对于 (整型 j = 1; j <dp .长度 ; j++) {
                dp [i][j] = dp [i-1][j] + dp [i][j-1];
            }
        }
 
        返回 dp [矩阵.长度-1][矩阵[0].长度-1];
    }
 

这是完整的程序,用于计算从MxN矩阵的左上到右下的所有路径。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 
组织.Arpit.爪哇2blog;
 
上市 CountMatrixPaths {
 
上市 静态的 虚空 主要([] args)
{
CountMatrixPaths cmp= CountMatrixPaths();
整型[][] 矩阵= {
{1,2,3},
{4,5,6},
{7,8,9}
};
整型 totalPathsRec = cmp.countMatrixPathsRec(矩阵,0,0);
系统..打印(“使用递归到达左上到右下的总路径:”+totalPathsRec);
整型 totalPaths = cmp.countMatrixPathsDynamicProgramming(矩阵);
系统..打印(“使用DP到达左上至右下的总路径:”+totalPaths);
}
上市 整型 countMatrixPathsRec(整型 [][] 矩阵, 整型 , 整型 关口){
        //基本情况
        //如果到达最后一行或最后一列,则只有一条路可走
        如果(==矩阵.长度-1 || 关口==矩阵[0].长度-1){
            返回 1;
        }
        返回 countMatrixPathsRec(矩阵, +1, 关口) + countMatrixPathsRec(矩阵, , 关口+1);
    }
上市 整型 countMatrixPathsDynamicProgramming(整型 [][] 矩阵){
        整型 dp [][] = 整型[矩阵.长度][矩阵[0].长度];
 
 
        //第一行的路径数将为1,因为您只能沿一个方向移动
        对于 (整型 i = 0; i <dp .长度 ; i++) {
            dp [0][i] = 1;
        }
 
        //第一列的路径数将为1,因为您只能在一个方向上移动
        对于 (整型 i = 0; i <dp .长度 ; i++) {
            dp [i][0] = 1;
        }
 
        对于 (整型 i = 1; i <dp .长度 ; i++) {
            对于 (整型 j = 1; j <dp .长度 ; j++) {
                dp [i][j] = dp [i-1][j] + dp [i][j-1];
            }
        }
 
        返回 dp [矩阵.长度-1][矩阵[0].长度-1];
    }
 
}
 

这是上述程序的输出。

使用递归到达左上到右下的总路径:6
使用DP到达左上至右下的总路径:6

那’所有关于计数从MxN矩阵的左上到右下的所有路径。

分享这个

作者

关注作者

相关文章

  • 11月29日

    超过100个Java编码面试问题

    我一直在发布有关各种主题的数据结构和编码面试问题,例如数组,队列,堆栈,二叉树,LinkedList,字符串,数字,ArrayList等。因此,我将合并一个Java编码面试问题列表以创建索引发布。每当我添加新的Java [时,我都会继续添加指向此帖子的链接[…]

  • 4月18日

    到达最后一个索引的最小跳转数

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何找到到达上一个索引的最小跳转数。问题给定一个正整数数组A(可能为零),每个索引表示[…]

  • 3月28日

    对0、1和2的数组进行排序

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何对0、1和2s的数组进行排序。我们已经看到了有关对数组中的0s和1s进行排序的文章。问题给定一个包含零的数组,[…]

  • 3月04

    通过跳转检查是否有可能到达给定数组的末尾

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。问题给定一个具有正整数作为元素的数组,该数组指示可以从数组中任何位置进行跳转的最大长度。检查是否可以[…]

  • 2月17日

    检查数组元素是否连续

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将看到如何检查数组元素是否连续。问题给定一个数组,我们需要检查数组是否包含连续的元素。例如:输入:array [] = {5,3,4,[…]

  • 2月04日

    O(Sqrt(height))中的K元树的LCA

    如果您想练习数据结构和算法程序,可以阅读100多种数据结构和算法程序。在这篇文章中,我们将了解如何在O(Sqrt(height))中找到K元树的最低公共祖先。我们已经看到了如何在O(n)复杂度中找到n元树的LCA。给定[…]

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

订阅我们的新闻

获取质量竞彩篮球分析到您的收件箱。现在订阅。


成为朋友

©2020 爪哇2博客