62. Unique Paths

网格路径计数算法
本文介绍了一种计算机器人从网格左上角到右下角所有唯一路径数量的算法。提供了两种解决方案,一种是递归方法,另一种是使用杨辉三角原理进行动态规划的方法。

A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

How many possible unique paths are there?

img

Above is a 3 x 7 grid. How many possible unique paths are there?

Note: m and n will be at most 100.

我的答案:

    public static int uniquePaths(int m, int n) {
        int top = 1;
        int left = 1;
        return pathSum(top,left,m,n);
    }
    public static int pathSum(int top,int left,int m,int n){
        if( left == m && top == n){
            return 1;
        }else if(top==n){
        return pathSum(top,left+1,m,n);
        }else if( left == m){
            return pathSum(top+1,left,m,n);
        }else if( left < m && top < n){
            return pathSum(top+1,left,m,n)+ pathSum(top,left+1,m,n);
        } 
        return 0;
     }

大神答案:

1.简化版的递归
     public int uniquePaths(int m, int n) {
        return uniquePaths(1,1,m, n);
    }
    
    public int uniquePaths(int currentRow, int currentColumn, int m, int n){
        if(currentRow==m || currentColumn==n){
            return 1;
        }    
        return uniquePaths(currentRow+1, currentColumn, m ,n ) + uniquePaths(currentRow,                    currentColumn+1, m, n);
    }

2.利用杨辉三角求解:
在Dynamic Programming思路的指引下,我们可以尝试将递归的方法改变为循环的方法来解决。这里就运用到了数学中的杨辉三角。很显然,最左侧一行和最顶侧一行的到达路径数都是1,而任何一个非该行列的节点都可以通过左侧节点和上侧节点的路径数相加得到从起点出发到达自己共有的路径数。我们可以利用二维数组来实现叠加。代码如下:
    public static int pathSum(int top,int left,int m,int n){
        int[][] a = new int[m][n];
        
        for (int i = 0; i < m; i++) {
            a[i][0] = 1;
        }
        
        for (int i = 0; i < n; i++) {
            a[0][i]=1;
        }
        
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                a[i][j] = a[i][j-1]+a[i-1][j];
            }
        }
        return a[m-1][n-1];
    }

转载于:https://www.cnblogs.com/luozhiyun/p/8418766.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值