62. 不同路径

题目:

吐槽:可以通过数学分析得出计算公式。表达出公式就可以A掉这个题。

代码

/**
     *
     * 得出计算公式C(m+n-2,Math.min(m-1,n-1)),m+n-2是总的要走的步数,Math.min(m-1,n-1)是往一个方向要走的步数(我们选择最小的那个方向)。
     * @param m
     * @param n
     * @return
     */
    public int uniquePaths(int m, int n) {
        int count = m+n-2;
        int index = m>n?n-1:m-1;
        long sum = 1;
        long sum2 = 1;
        for(int i = count ;i>count-index;i--){
            sum = sum*i;
        }
        for(int j = 1;j<=index;j++){
            sum2 = sum2*j;
        }
        return (int) (sum/sum2);
    }

 

动态规划版本

 /**
     * 动态规划,通过二维数组,写出已知的项得出后续项的逻辑。
     *  1)首先可以写出当m == 1和 n==1的时候,行走的方案是1,将相关数组填充好。
     *  2)然后再写result[2][2]你会发现,result[m][n] = result[m-1][n] + result[m][n-1].
     *  3)把整个数组填满,最后result[m][n]就是最后的结果
     * @param m
     * @param n
     * @return
     */
    public static int uniquePaths(int m, int n) {
        int[][] result = new int[m+1][n+1];
        //1.填写初始的已知结果的数组内容
        for(int i = 1;i<result[1].length;i++){
            result[1][i] = 1;
        }
        for(int i = 1;i<result.length;i++){
            result[i][1] = 1;
        }
        //2.计算整个数据的结果
        for(int i = 2;i<result.length;i++){
            for(int j = 2;j<result[i].length;j++){
                result[i][j] = result[i-1][j]+result[i][j-1];
            }
        }
        //3.result[m][n]就是结果
        return result[m][n];
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值