题目链接

不同路径

题目描述

image.png

实现代码

dfs深度优先遍历思想,超时:

  1. class Solution {
  2. int result = 0;
  3. public int uniquePaths(int m, int n) {
  4. dfs(1, 1, m, n);
  5. return result;
  6. }
  7. public void dfs(int i, int j, int m, int n) {
  8. if(i > m || j > n) {
  9. return;
  10. }
  11. if(i == m && j == n) {
  12. result++;
  13. return;
  14. }
  15. dfs(i+1, j, m, n);
  16. dfs(i, j+1, m, n);
  17. }
  18. }

动态规划思想:dp[i][j]记录从(1,1)到位置(i,j)的路径数,状态转移方程为:

dp[i][j] = dp[i-1][j] + dp[i][j-1];

初始化条件:

dp[1][j] = 1 j取任何数 dp[i][1] = 1 i取任何数

实现代码:

  1. class Solution {
  2. public int uniquePaths(int m, int n) {
  3. int[][] dp = new int[m+1][n+1];
  4. for(int i=1; i<=m; i++) {
  5. dp[i][1] = 1;
  6. }
  7. for(int j=1; j<=n; j++) {
  8. dp[1][j] = 1;
  9. }
  10. for(int i=2; i<=m; i++) {
  11. for(int j=2; j<=n; j++) {
  12. dp[i][j] = dp[i-1][j] + dp[i][j-1];
  13. }
  14. }
  15. return dp[m][n];
  16. }
  17. }

在二维数组的基础上进行降维优化,实现代码如下:

  1. class Solution {
  2. public static int uniquePaths(int m, int n) {
  3. int[] dp = new int[n];
  4. dp[0] = 1;
  5. for(int i = 0; i < m ; i++){
  6. for(int j = 1; j < n; j++){
  7. dp[j] = dp[j - 1] + dp[j];
  8. }
  9. }
  10. return dp[n - 1];
  11. }
  12. }