LeetCode刷题——不同路径#62#Medium

不同路径题目的思路探讨与源码
    不同路径的题目如下图,该题属于数组类的题目,主要考察对于动态规划的理解以及排列组合的认识,通过找出动态规划的方程或是归纳出排列组合的公式后,就可以轻松解出该问题。本文第一种方法是排列组合的方法,第二种方法是动态规划的方法,前一种使用的是Python编写,后一种使用的是Java编写,该题思路较为基础,但需要明确其动态规划公式,并且对题目的认识要深刻。
在这里插入图片描述
    本人认为该题目可以使用排列组合的方法,因为只能往下或者往右走动,所以往下走是m-1的情况,往右边走是n-1的情况,而总的步数是两者之和即K=m+n-2种,我们只需要在m-1和n-1的全排列里面去选取K种走法,就是最终的结果。也就是排列组合的res=(m+n-2)!/(m-1)!(n-1)! ,而通过程序我们可以将该公式转化为一个循环的连乘法表达式,只需要上下同时除以(n-1)! 即可,而相当于原式变为res=(m+n-2)(…)*(n)/(m-1)! ,所以我们的代码按照公式如下:

#喷火龙与水箭龟
class Solution:
    def uniquePaths(self, m: int, n: int) -> int:
        finalPrime=1
        k=n+m-2
        for ij in range(1,m):
            finalPrime=finalPrime*(ij+k-(m-1))/ij
        return int(finalPrime)

在这里插入图片描述
    上述的算法思路其实就是数学归纳法和排列组合,即使用者经过观察和总结可以得出公式,然后按照公式去写一个for循环即可得到结果。而对于动态规划法来说,可以使用递推公式D[i][j] = D[i-1][j]+D[i][j-1] ,从另一个角度来看,其实这种二维形式只用到了当前值左边和上面的值,也就是说四个方向的相邻值,只用了两个,那么我们使用一维数组其实就可以,也就是 D[i] = D[i]+D[i-1] 这里可以这么理解,D[i]的当前值是由历史的D[i]值和已经更新过的D[i-1]的值进行求和得到的,其实就是把一个矩阵看作一个一维数组,因为历史的D[i]值其实就是上一行的对应位置的值,而已经更新过的D[i-1]的值其实相当于矩阵里当前元素的左边的那个值。

#喷火龙与水箭龟
class Solution {
    public int uniquePaths(int m, int n) {
        int[] res  = new int[m];
        for(int ij=0;ij<m;ij++){
            res[ij]=1;
        }
        for(int ik=1;ik<n;ik++){
            for(int jk=1;jk<m;jk++){
                res[jk] = res[jk]+res[jk-1];
            }
        }
        return res[m-1];
    }
}

在这里插入图片描述
    从结果来说是不管是排列组合还是动态规划都是可以的,但是应该可以进一步提速,希望朋友们能够多多指教,非常感谢。

猜你喜欢

转载自blog.csdn.net/qq_26727101/article/details/112795904