coding4ever

[leetcode] Unique Paths 从二维grid中找出所有的unique paths

原题:https://leetcode.com/problems/unique-paths/#/description

就是给了一个n*m的矩阵。从top-left顶点往bottom-right终点走。每次只能往bottom,或者往right走。(还不算太可怜,每次还有两种选择。往往我们只有一种选择。)。

目标是:找出unique path的个数。

思路:计算解个数的题多半是用DP。 

  1. dp[i][j]意义:从起点到位置(i, j)的路径总数。

  2. 通项公式: 

                     2.1: 为了到达(i,j)这个点,只可能是从(1)上面的点(i-1,j)来的,和(2) 左边的点(i,j-1)来的。所以dp[i][j]dp[i-1][j]  + dp[i][j-1] 

                     2.2: 对于边界情况,及在最上面和最左边的情况。dp[0][j] = 1; dp[i][0] =1. [因为只能往右边和下面走]

  3. 计算方向: 从上到下,从左到右。最终返回dp[m-1][n-1]

public 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];
    }
}

 

优化方法:

上面的解法使用了一个二维的DP数组。其实这题可以只用一个一维的DP数组就可以了。

思路:因为dp[i][j] = dp[i][j-1]  + dp[i-1][j]. 所以,如果只有一维,那么可以把dp[i][j-1]看成dp[j-1]. 可以把dp[i-1][j]看成dp[j]. 然后把两个的和继续存在dp[j]中。

 

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

 

posted on 2017-03-15 09:09  coding4ever  阅读(110)  评论(0编辑  收藏  举报

导航