62. 不同路径
题目介绍
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
示例 2:
输入:m = 3, n = 2
输出:3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
- 向右 -> 向下 -> 向下
- 向下 -> 向下 -> 向右
- 向下 -> 向右 -> 向下
示例 3:
输入:m = 7, n = 3
输出:28
示例 4:
输入:m = 3, n = 3
输出:6
提示:
1 <= m, n <= 100
题目数据保证答案小于等于 2 * 109
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/unique-paths
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
动态规划
本题可以使用动态规划:
d
p
[
i
,
j
]
=
d
p
[
i
−
1
,
j
]
+
d
p
[
i
]
[
j
−
1
]
dp[i, j]=dp[i-1,j]+dp[i][j-1]
dp[i,j]=dp[i−1,j]+dp[i][j−1]
d
p
[
i
,
0
]
=
1
,
d
p
[
0
,
i
]
=
1
dp[i, 0]=1, dp[0,i]=1
dp[i,0]=1,dp[0,i]=1
需要双层循环的遍历更新到达每个点的路径数。
class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int>> dp(m, vector<int>(n, 1));
int i,j;
for(i=1; i<m; i++)
{
for(j=1; j<n; j++)
{
dp[i][j] = dp[i-1][j] + dp[i][j-1];
}
}
return dp[m-1][n-1];
}
};
时间复杂度为 O ( m n ) O(mn) O(mn),空间复杂度为 O ( m n ) O(mn) O(mn)。
组合数学
class Solution {
public:
int uniquePaths(int m, int n) {
long long ans = 1;
for (int x = n, y = 1; y < m; ++x, ++y) {
ans = ans * x / y;
}
return ans;
}
};
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/unique-paths/solution/bu-tong-lu-jing-by-leetcode-solution-hzjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
时间复杂度: O ( m ) O(m) O(m)。由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m ≤ n m \leq n m≤n,这样空间复杂度降低至 O ( min ( m , n ) ) O(\min(m, n)) O(min(m,n))。
空间复杂度: O ( 1 ) O(1) O(1)。
作者:LeetCode-Solution
链接:https://leetcode.cn/problems/unique-paths/solution/bu-tong-lu-jing-by-leetcode-solution-hzjf/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。