62. Unique Paths(不同路径)

题目链接:https://leetcode.com/problems/unique-paths/

方法一:

思路用dp,可以观察到这个题目存在最优子结构,可以重复使用,

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

然后就可以很好地求解了,注意初始化。

AC 0ms 100% Java:

class Solution {
    public int uniquePaths(int m, int n) {
        int[][] dp=new int[m][n];
        for(int i=0;i<m;i++){
            dp[i][0]=1;
        }
        for(int j=0;j<n;j++){
            dp[0][j]=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-1][n-1];
    }
}

方法二:回溯

经过实践,回溯会超时,它并没有利用已有的解,造成了重复计算。

顺便贴个代码吧,例子通过了,最后提交超时了。

class Solution {
    public int uniquePaths(int m, int n) {
        return search(m,n,0,0);
    }
    public int search(int m,int n,int i,int j){
        if(i==m-1&&j==n-1)
            return 1;
        if(i>m-1||j>n-1)
            return 0;
        return search(m,n,i+1,j)+search(m,n,i,j+1);
    }
}

后来想了一下,可以用辅助数组保存回溯递归时节点的值,不过那有和dp

思路有点相同了。

猜你喜欢

转载自blog.csdn.net/God_Mood/article/details/88189844