剑指 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]; } }