前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >62. Unique Paths

62. Unique Paths

作者头像
luozhiyun
发布2019-09-10 18:44:53
2570
发布2019-09-10 18:44:53
举报

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
img

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

Note: m and n will be at most 100.

我的答案:

代码语言:javascript
复制
    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;
     }

大神答案:

代码语言:javascript
复制
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];
    }
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018-02-05 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档