剑指 Offer II 098. 路径的数目(62. 不同路径)

题目:

 

 

 

思路:

【1】动态规划的方式

【2】组合数学

 

代码展示:

组合数学的方式:

//时间0 ms击败100%
//内存38.3 MB击败47.78%
//时间复杂度:O(m)。
//由于我们交换行列的值并不会对答案产生影响,因此我们总可以通过交换 m 和 n 使得 m≤n,这样空间复杂度降低至 O(min⁡(m,n))。
//空间复杂度:O(1)。
class Solution {
    public int uniquePaths(int m, int n) {
        long ans = 1;
        for (int x = n, y = 1; y < m; ++x, ++y) {
            ans = ans * x / y;
        }
        return (int) ans;
    }
}

 

动态规划的方式:

//时间0 ms击败100%
//内存38.4 MB击败29.71%
//时间复杂度O(m*n)
//空间复杂度O(m*n)
class Solution {
    public int uniquePaths(int m, int n) {
        if (m <= 0 || n <= 0) return 0;
        //首先规定了是只能向右和向下走
        int[][] flag = new int[m][n];
        //初始化第一行的参数,由于只能向右走故第一行的达到路径都只能是1
        for (int i = 0; i < flag[0].length; i++){
            flag[0][i] = 1;
        }
        //初始化第一列的参数,由于只能向下走故第一列的达到路径都只能是1
        for (int i = 0; i < flag.length; i++){
            flag[i][0] = 1;
        }
        //根据公式F[位置(I,J)] = F[位置向上一位的位置(I-1,J)] + F[位置向左一位的位置(I,J-1)]
        //计算出每个位置达到路径的条数
        for (int i = 1; i < flag.length; i++){
            for (int j = 1; j < flag[0].length; j++){
                flag[i][j] = flag[i-1][j] + flag[i][j-1];
            }
        }

        return flag[m-1][n-1];
    }
}

 

posted @ 2023-04-13 12:27  忧愁的chafry  阅读(17)  评论(0编辑  收藏  举报