Unique Paths - LeetCode

题目链接

Unique Paths - LeetCode

注意点

  • 数字很大,结果可能会溢出

解法

解法一:dfs,效率很低。

class Solution {
public:
    void dfs(int x,int y,int& ret,int m,int n,vector<vector<int>> direction)
    {
        if(x == m-1 && y == n-1)
        {   
            ret++;
            return;
        }
        //cout << x << " " << y << endl;
        if(x+1 <= m-1) dfs(x+direction[0][0],y+direction[0][1],ret,m,n,direction);
        if(y+1 <= n-1) dfs(x+direction[1][0],y+direction[1][1],ret,m,n,direction);
    }
    int uniquePaths(int m, int n) {
        int ret = 0;
        vector<vector<int>> direction{{1,0},{0,1}};
        dfs(0,0,ret,m,n,direction);
        return ret;
    }
};

解法二:dp,走到某一格的位置等于它左边和上面格子的dp值之和。其实只需要一个一维数组也可以实现。时间复杂度O(mn)

class Solution {
public:
    int uniquePaths(int m, int n) {
        int i,j,dp[n][m];
        for(i = 0; i < n;i++)
        {
            for(j = 0;j < m;j++)
                dp[i][j] = 0;
        }
        dp[0][0] = 1;
        for(i = 0;i < n;i++)
        {
            for(j = 0;j < m;j++)
            {
                if(i-1 >= 0) dp[i][j] += dp[i-1][j];
                if(j-1 >= 0) dp[i][j] += dp[i][j-1];
            }
        }
        return dp[n-1][m-1];
    }
};

解法三:参见Code_Ganker的博客。我的代码和他的略有不同,我没有区分m和n哪个更小,这样最后就要进行四舍五入。

class Solution {
public:
    int uniquePaths(int m, int n) {
        double num = 1, denom = 1; // int may overflow
        for (int i = 1; i <= n - 1; i++) 
        {
            num *= m + n - 1 - i;
            denom *= i;
        }
        return (int)(num / denom + 0.5); // to the nearest whole number
    }
};

小结

  • 动态规划题
posted @ 2019-02-28 21:41  闽A2436  阅读(92)  评论(0编辑  收藏  举报