LeetCode 62 不同路徑 HERODING的LeetCode之路
阿新 • • 發佈:2020-12-13
技術標籤:LeetCodedfsleetcode演算法c++資料結構
一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。
機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。
問總共有多少條不同的路徑?
例如,上圖是一個7 x 3 的網格。有多少可能的路徑?
示例 1:
輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。
- 向右 -> 向右 -> 向下
- 向右 -> 向下 -> 向右
- 向下 -> 向右 -> 向右
示例 2:
輸入: m = 7, n = 3
輸出: 28
提示:
1 <= m, n <= 100
題目資料保證答案小於等於 2 * 10 ^ 9
來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/unique-paths
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。
解題思路:
第一種方法我自然而然想到了遞迴,但是很不幸,超時了。。。
class Solution {
public:
int uniquePaths(int m, int n) {
int num = 0;
dfs(num, m, n, 1, 1, new map<>());
return num;
}
void dfs(int &num, int m, int n, int x, int y, map<String, int> mp){
if(x == m && y == n){
num ++;
}
if(x > m || y > n){
return;
}
// 向右走一步
dfs (num, m, n, x + 1, y);
//向下走一步
dfs(num, m, n, x, y + 1);
}
};
果然還是動態規劃好用啊
class Solution {
public:
int uniquePaths(int m, int n) {
// dp陣列
vector<vector<int>> f(m, vector<int>(n));
// 第一行第一列都是1
for (int i = 0; i < m; ++i) {
f[i][0] = 1;
}
for (int j = 0; j < n; ++j) {
f[0][j] = 1;
}
for (int i = 1; i < m; ++i) {
for (int j = 1; j < n; ++j) {
f[i][j] = f[i - 1][j] + f[i][j - 1];
}
}
return f[m - 1][n - 1];
}
};
但是真正的王者還是組合數學,那是真的簡潔!
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;
}
};