[letecode java] Unique Paths

来源:互联网 发布:指南针软件诈骗 编辑:程序博客网 时间:2024/06/01 08:52

A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below).

The robot can only move either down or right at any point in time. The robot is trying to reach the bottom-right corner of the grid (marked 'Finish' in the diagram below).

How many possible unique paths are there?


很明显的动态规划问题,但第一次做的时候,理解成了递归问题,代码很短,但结果超时。

public int uniquePaths(int m, int n) {
      if(m==1 || n==1) return 1;
      return uniquePaths(m-1, n) + uniquePaths(m, n-1);
 }
所以,一定要明确动态规划的定义,即当前的状态和之前的状态有关,而不是当前状态会影响接下来的状态。这一点很重要,直接决定了你的思路。

定义一个m*n二维矩阵matrix表示到达某一节点的路径数,从动态规划的角度,很容易发现matrix[i][j]=matrix[i-1][j]+matrix[i][j-1],即到达当前节点的路径数等于到达其左边节点的路径数加上上面节点的路径数。代码如下:

public int uniquePaths(int m, int n) {
        int[][] ma=new int[m][n];
        for(int i=0;i<m;i++)
        for(int j=0;j<n;j++){
            if(i==0||j==0){
                ma[i][j]=1;
            }
            else{
                ma[i][j]=ma[i-1][j]+ma[i][j-1];
            }
        }
        return ma[m-1][n-1];
    }

上述代码的空间复杂度为o(mn),这里还可以做优化,可以将空间复杂度缩减到o(n),定义一个 n维数组result,表示当前行到某一节点的路径数,初始全赋值为1,更新则从原图中的第二行开始。result[j]+=result[j-1],更新前,result[j]中存储上一行第j个节点的路径数,result[j-1]表示当前行第j-1个节点的路径数,更新后表示当前行第j个节点的路径数,也满足要求。

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

0 0
原创粉丝点击