unique-paths 总结


其实就是求(m+n-2)中取(m-1)的组合数


错误方法1:

强行算组合数:当m,n比较大时,数会超出计算机能表示的范围。

class Solution {

public:
    int uniquePaths(int m, int n) {
        /*if(m <= 0 || n <= 0)
            return 0;
        int a = 1;
        for (int i = m; i <= m + n - 2 ; i++ )
        {
            a = a * i;
        }
        int b = 1;
        for (int i = 1; i <= n - 1 ; i++ )
        {
            b = b * i;
        }
        return a/b;
    }

};


错误方法2:
递归,会有很多重复的计算,效率低,递归栈大。

计算uniquePaths(m - 1, n) 和 uniquePaths(m, n - 1)都会计算一次uniquePaths(m - 1, n - 1),重复计算。

class Solution {

public:
    int uniquePaths(int m, int n) {
        
        if(m <= 0 || n <= 0)
            return 0;
        else if(m == 1 || n == 1)
            return 1;
        else
        {
    return uniquePaths(m - 1, n) + uniquePaths(m, n - 1);
        }            
    }
};


正确方法:

对错误方法2进行改进,

用动态规划思想,

从后向前分析,用数组a[m][n]存储(i,j)到终点的路径数,

逐行a[i][j]进行赋值,每个a[i][j]只用计算一次

从而消除重复计算

class Solution {

public:
    int uniquePaths(int m, int n) {
        
        if(m <= 0 || n <= 0)
            return 0;
        else if(m == 1 || n == 1)
            return 1;

//初始化
        int a[m][n];
         for(int i = 0 ; i < m; i++){
for(int j =0 ; j < n; j++){
                a[i][j] = 1;
            }
        }

//计算
        for(int i = 1 ; i < m; i++){
for(int j =1 ; j < n; j++){
                a[i][j] = a[i-1][j] + a[i][j-1];
            }
        }

        return a[m-1][n-1];            
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值