62. Unique Paths
题目:
A robot is located at the top-left corner of a m x ngrid (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?

Above is a 3 x 7 grid. How many possible unique paths are there?
Note: m and n will be at most 100.
链接: http://leetcode.com/problems/unique-paths/
题解:
dp的经典问题,每次向右或向下走一步。第一行或者第一列走到头只有一种方法,所以初始化为1,转移方程是dp[i][j] = dp[i - 1][j] + dp[i][j - 1]
Time Complexity O(m * n), Space Complexity O(m * n)。
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];
    }
}
Update:
public class Solution {
    public int uniquePaths(int m, int n) {
        if(m == 0 || m == 0)
            return 0;
        int[][] dp = new int[m][n];
        for(int i = 0; i < m; i++)      // initialize first column
            dp[i][0] = 1;
        for(int j = 1; j < n; j++)      // initialize first row
            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];
    }
}
二刷:
Java:
经典的dp,据说还可以用Math来做。我们还是使用dp。
2D DP:
建立一个m x n矩阵,初始化第一条边和第一列为1,然后利用转移方程res[i][j] = res[i - 1][j] + res[i][j - 1],最后返回res[m - 1][n - 1]
Time Complexity - O(mn), Space Complexity - O(mn)
public class Solution {
    public int uniquePaths(int m, int n) {
        if (m < 0 || n < 0) {
            return 0;
        }
        int[][] res = new int[m][n];
        for (int i = 0; i < m; i++) {
            res[i][0] = 1;
        }
        for (int j = 1; j < n; j++) {
            res[0][j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                res[i][j] = res[i - 1][j] + res[i][j - 1];
            }
        }
        return res[m - 1][n - 1];
    }
}
1D DP with rolling array:
对这种简单的DP,一般我们可以用rolling array来减少空间复杂度。我们建立一个长度为n的array,先初始化其中每个元素的值为1,然后在遍历m x n的时候,转移方程简化为 res[j] += res[j - 1], 还是之前res[i][j]左边和上边的元素。这样节约了一点空间。
Time Complexity - O(mn), Space Complexity - O(n)
public class Solution {
    public int uniquePaths(int m, int n) {
        if (m < 0 || n < 0) {
            return 0;
        }
        int[] res = new int[n];
        for (int j = 0; j < n; j++) {
            res[j] = 1;
        }
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                res[j] += res[j - 1];
            }
        }
        return res[n - 1];
    }
}
三刷:
Java:
2D dp:
public class Solution {
    public int uniquePaths(int m, int n) {
        if (m < 0 || n < 0) return 0;
        int[][] dp = new int[m][n];
        for (int i = 0; i < m; i++) dp[i][0] = 1;
        for (int j = 1; 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];
    }
}
Rolling array 1:
public class Solution {
    public int uniquePaths(int m, int n) {
        if (m < 0 || n < 0) return 0;
        int[] dp = new int[n];
        for (int j = 0; j < n; j++) dp[j] = 1;
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[j] += dp[j - 1];
            }
        }
        return dp[n - 1];
    }
}
Rolling array2: 现在才能领会到为什么我们有的时候建立dp数组要用int[] dp = new int[n + 1]。 多增加一个长度的话是为了写的时候不用对第一行赋初值,看起来比较简练,但其实时间复杂度还是一样的。
public class Solution {
    public int uniquePaths(int m, int n) {
        if (m < 0 || n < 0) return 0;
        int[] dp = new int[n + 1];
        dp[0] = 1;
        for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                dp[j] += dp[j - 1];
            }
        }
        return dp[n - 1];
    }
}
Reference:
https://leetcode.com/discuss/9110/my-ac-solution-using-formula
https://leetcode.com/discuss/47829/math-solution-o-1-space
62. Unique Paths的更多相关文章
- leetcode 62. Unique Paths 、63. Unique Paths II
		
62. Unique Paths class Solution { public: int uniquePaths(int m, int n) { || n <= ) ; vector<v ...
 - 刷题62. Unique Paths
		
一.题目说明 题目62. Unique Paths,在一个m*n矩阵中,求从左上角Start到右下角Finish所有路径.其中每次只能向下.向右移动.难度是Medium! 二.我的解答 这个题目读读题 ...
 - [LeetCode] 62. Unique Paths 不同的路径
		
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
 - 62. Unique Paths && 63 Unique Paths II
		
https://leetcode.com/problems/unique-paths/ 这道题,不利用动态规划基本上规模变大会运行超时,下面自己写得这段代码,直接暴力破解,只能应付小规模的情形,当23 ...
 - LeetCode OJ 62. Unique Paths
		
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
 - LeetCode 62. Unique Paths(所有不同的路径)
		
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
 - 62. Unique Paths(中等,我自己解出的第一道 DP 题^^)
		
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
 - 【一天一道LeetCode】#62. Unique Paths
		
一天一道LeetCode系列 (一)题目 A robot is located at the top-left corner of a m x n grid (marked 'Start' in th ...
 - [leetcode]62. Unique Paths 不同路径
		
A robot is located at the top-left corner of a m x n grid (marked 'Start' in the diagram below). The ...
 
随机推荐
- C#中Delegate
			
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
 - Nginx+Tomcat动静分离
			
需求:nginx处理用户请求的静态页面,tomcat处理用户请求jsp页面,来实现动态分离,nginx处理静态页面效率远高于tomcat,这样一来就能更好的提高并发,处理性能. 准备软件: 下载jdk ...
 - Wpf从资源中重用UI元素
			
在我的界面上有几个选项卡,每个选项卡中都有下面的元素: <StackPanel Orientation="Horizontal"> <Button Content ...
 - Thread线程初探
			
using System; using System.Threading; class Example { static void Main() { TimeSpan interval = , , ) ...
 - 如何访问Microsoft Azure Storage
			
首先先要创建存储账户 http://www.cnblogs.com/SignalTips/p/4119128.html 可以通过以下的几个方式访问 通过Visual Studio 2013 Commu ...
 - 介绍一下linux的文件系统
			
(1)/bin:该目录用于存放用户命令. 目录 /usr/bin 中也存放了一些用户命令.(2)/sbin:该目录用于存放许多系统命令,例如 shutdown.目录 /usr/bin 中也包括了许多系 ...
 - [转] c和python利用setsockopt获得端口重用
			
假如端口被socket使用过,并且利用socket.close()来关闭连接,但此时端口还没有释放,要经过一个TIME_WAIT的过程之后才能使用.为了实现端口的马上复用,可以选择setsockopt ...
 - ASP.NET MVC +EasyUI 权限设计(二)环境搭建
			
请注明转载地址:http://www.cnblogs.com/arhat 今天突然发现博客园出问题了,老魏使用了PC,手机,平板都访问博客园了,都是不能正常的访问,原因是不能加载CSS,也就是不能访问 ...
 - windows下SSH客户端远程访问Linux出现错误
 - cocos2dx中创建标签CCLabel的三种方法及特点
			
创建标签的三种方式:1.CCLabelTTF (True Type Font,又叫本地字体)这是最简单,也是最常用的方式,不依赖于资源文件,也不依赖于某个系统,所指定的字体如果系统没有,则会提 ...