Leetcode腾讯精选练习22

原题:Leetcode62 不同路径
https://leetcode-cn.com/problems/unique-paths/
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?

在这里插入图片描述
例如,上图是一个7 x 3 的网格。有多少可能的路径?

1.数学方法
看到这题 脑袋里面马上就想到高中排列组合问题,直接用排列组合就能得到路径关于m,n的表达式了,编程只用算阶乘就行了。当然,这个只是写得好玩,还是得用别的方法才行。

public class Solution {
    public int UniquePaths(int m, int n) {
            double fac1 = 1;
            double fac2 = 1;
            int j = (m <= n ? m : n) - 1;
            int k = m + n - 2;
            for (int i = 1; i <= j; i++)
            {
                fac1 = fac1 * i;
                fac2 = fac2 * k;
                k = k - 1;
            }
            return (int)(fac2 / fac1);
        
    }
}

在这里插入图片描述
2.递归
很容易理解,当m=n=1的时候路径是一条,其他时候 坐标m,n的点的路径是点m-1,n和点m,n-1路径的和。这样就能用递归去写了。
但是运行却超出了时间限制。

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

3.动态规划
这个是看了马老师的blog之后知道的方法。感觉原理和我用递归一样,只是对于每个坐标m,n 都用坐标m,n的点的路径是点m-1,n和点m,n-1路径的和这个规律给出了路径数。blog链接如下
https://blog.csdn.net/LSGO_MYP/article/details/100775739

所以这里有一个问题,同样的原理下,为什么递归的方法执行起来比动态规划要慢。我感觉它们执行的运算都是一样的每个m,n坐标就算了一次。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值