leetcode 62 不同的路径

描述:

m*n的矩阵,从左上角走到右下角,只能向下或向右走。

 

解决:

简单dp,dp[i][j]表示到i,j这点总共多少种路径。

dp[i][j] = dp[i][j - 1] + dp[i - 1][j],化为一维:

int uniquePaths(int m, int n) {
    int* arr = new int[m]();
    for (int i = 0; i < m; ++i)  // 初始化
        arr[i] = 1;

    for (int i = 1; i < n; ++i) {
        for (int j = 0; j < m; ++j) {
            if (j == 0)
                arr[0] = 1;
            arr[j] = arr[j - 1] + arr[j];
        }
    }
    return arr[m - 1];
}

注意,1*1的化结果是1的,如果别的题目是0,初始化里i改为从1开始即可。

 

也可以用数学点的方法解决,m*n的矩阵,假设m是行,则无论怎么走总会向下走m步,向右走n步,

即从m+n中选m个点,剩下为n,即C(m, m+n),组合,朴素解法:

int uniquePaths(int m, int n) {
    int sum = m + n - 2;
    int c = min(m - 1, n - 1);
    long ret = 1;
    long chu = 1;

    for (int i = 0; i < c; ++i)
        ret *= sum--;
    for (int i = 1; i <= c; ++i)
        chu *= i;
    return ret/chu;
}

在leetcode可以过,但有快速计算组合数的算法。

 


 

dp复杂度:O(m*n)

算组合数复杂度:不大于O(m!),这只是大概的数量级,还有logm的求法。

注意:实际100的阶乘非常大,大于long类型最大值。

posted on 2017-12-26 15:45  willaty  阅读(139)  评论(0)    收藏  举报

导航