LeetCode 62. 不同路径c++/java详细题解
Posted 林深时不见鹿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了LeetCode 62. 不同路径c++/java详细题解相关的知识,希望对你有一定的参考价值。
1、题目
一个机器人位于一个 m x n
网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向下 -> 向下
2. 向下 -> 向下 -> 向右
3. 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
- 题目数据保证答案小于等于
2 * 109
2、思路
(动态规划) O ( m ∗ n ) O(m*n) O(m∗n)
状态表示: f[i,j]
表示从(0,0)
走到(i,j)
的所有不同路径的方案数。那么,f[m-1][n-1]
就表示从网格左上角到网格右下角的所有不同路径的方案数,即为答案。
状态转移:
由于限制了只能向下走或者向右走,因此到达(i,j)
有两条路径
- 从上方转移过来,
f[i][j] = f[i-1][j]
; - 从左方转移过来,
f[i][j] = f[i][j-1]
;
因此,状态计算方程为: f[i][j] = f[i-1][j] + f[i][j-1]
, 将向右和向下两条路径的方案数相加起来。
初始化条件: f[0][0] = 1
,从(0,0)
到达(0,0)
只有一条路径。
分析图示:
时间复杂度分析: O ( m ∗ n ) O(m*n) O(m∗n),其中 m m m和 n n n分别是网格的行数和列数 。
3、c++代码
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>>f(m, vector<int>(n,0));
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(!i && !j) f[i][j] = 1; //初始化
else{
if(i) f[i][j] += f[i - 1][j]; //如果可以从上方转移过来
if(j) f[i][j] += f[i][j - 1]; //如果可以从左方转移过来
}
return f[m - 1][n - 1];
}
};
4、java代码
class Solution {
public int uniquePaths(int m, int n) {
int[][] f = new int[m][n];
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
if(i == 0 && j == 0) f[i][j] = 1; //初始化
else{
if(i != 0) f[i][j] += f[i - 1][j]; //如果可以从上方转移过来
if(j != 0) f[i][j] += f[i][j - 1]; //如果可以从左方转移过来
}
return f[m - 1][n - 1];
}
}
原题链接: 62. 不同路径
以上是关于LeetCode 62. 不同路径c++/java详细题解的主要内容,如果未能解决你的问题,请参考以下文章