LeetCode 62. 不同路径

题目链接:

力扣icon-default.png?t=M276https://leetcode-cn.com/problems/unique-paths/LeetCode 62. 不同路径_第1张图片

【分析】首先可以直接用回溯法进行向右和向下的遍历,但是会超时

class Solution {

    int m, n, ans = 0;

    public void backTrack(int x, int y){
        if(x == m && y == n) ans++;
        else{
            int nx = x + 1;
            if(nx <= m) backTrack(nx, y);
            int ny = y + 1;
            if(ny <= n) backTrack(x, ny);
        }
    }

    public int uniquePaths(int m, int n) {
        this.m = m - 1; this.n = n - 1;
        backTrack(0, 0);
        return ans;
    }
}

【方法二 动态规划】之所以超时是因为我们从(0,1)走到(1,1)和从(1,0)走到(1,1)的时候都要把(1,1)作为起点再遍历一遍,所以这里面其实有很多重复的过程。

于是就需要通过动态规划来进行记忆化搜索,定义dp[i][j]为当前格子可走的方案种数,那么(i,j)这个点可以通过(i - 1, j)和(i, j - 1)这个两个点走过来,所以走到这里的方案数就是这两个位置dp数组值的和。为了方便我们将dp数组初始化为[m+1][n+1]并设置dp[0][1]为1,因为到达(1,1)这个位置就一种方案,可以通过dp[0][1]和dp[1][0]相加得到。

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp = new int[m + 1][n + 1];
        dp[0][1] = 1;
        for(int i = 1; i <= m; i++){
            for(int j = 1; j <= n; j++){
                dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
            }
        }
        return dp[m][n];
    }
}

 

 

你可能感兴趣的:(LeetCode,leetcode,动态规划)