1. 程式人生 > 其它 >LeetCode 62 不同路徑 HERODING的LeetCode之路

LeetCode 62 不同路徑 HERODING的LeetCode之路

技術標籤:LeetCodedfsleetcode演算法c++資料結構

一個機器人位於一個 m x n 網格的左上角 (起始點在下圖中標記為“Start” )。

機器人每次只能向下或者向右移動一步。機器人試圖達到網格的右下角(在下圖中標記為“Finish”)。

問總共有多少條不同的路徑?
在這裡插入圖片描述

例如,上圖是一個7 x 3 的網格。有多少可能的路徑?

示例 1:

輸入: m = 3, n = 2
輸出: 3
解釋:
從左上角開始,總共有 3 條路徑可以到達右下角。

  1. 向右 -> 向右 -> 向下
  2. 向右 -> 向下 -> 向右
  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;
    }
};