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 ...
随机推荐
- mercurial(hg)使用
# 版本管理软件的比较 svn 每个目录下建一个.svn目录实在是不爽. git 分支管理非常方便,但没感觉有什么用,主要还是在修改前提交一次代码, 等后悔时再回来,没什么其他的目的.关键是中文乱码问 ...
- Firebird数据库相关备忘录
Firebird数据库中有一些很特别的东西,很好用,但由于平时用的不多,记在这里,以备以后用到时查询. 1.以ADO 的OLE ODBC驱动方式访问 Firebird,可以使用如下连接串: FBCon ...
- Python-Day7 面向对象进阶/异常处理/Socket
一.面向对象高级语法部分 1.静态方法 通过@staticmethod装饰器即可把其装饰的方法变为一个静态方法,什么是静态方法呢?其实不难理解,普通的方法,可以在实例化后直接调用,并且在方法里 ...
- C# list 去重
/// <summary> /// 汽车商标 获取 /// Redis Key=zgqp315_Redis_TrademarkC_List /// </summary> /// ...
- ubuntu14.04 安装matlab r2013a
神奇的linux. 进入主题:matlab相信是不少工程人员缺少不了的工具,就我所在的通信行业更是如此,matlab的linux版本是和windows版本同步更新, 不过r2012之后只提供64位版本 ...
- OC类的本质,深入探讨,load方法和initialize方法
1:类的本质:类也是一种类,可以叫做类类,类对象,类类型: 2:类和对象在内存中分配问题(注意区分类的对象和类对象的概念) 类对象在内存中只有一份,且只加载一次,类对象中存放了类中定义的方法: 而成员 ...
- Java中List和ArrayList的区别
List:是一个有序的集合,可以包含重复的元素.提供了按索引访问的方式.它继承 Collection.List有两个重要的实现类:ArrayList 和 LinkedListArrayList:我们可 ...
- android studio 突然出现Gradle project sync failed 错误
出现: 之前还是好好的,突然就出现Gradle project sync failed 错误,网上原因可能是工具的问题. 解决办法: 重新打开android studio就好了.不知道大家还有其他的 ...
- ADO.NET- 基础总结及实例介绍
最近闲暇时间写的一些小程序中,访问数据库比较多:下面主要介绍下ADO.NET方面知识,有不足之处,希望大神们不吝赐教: 提到ADO.NET,经常会和ASP.NET进行混淆,两者的区别很大,没有可比性, ...
- SCRUM团队的三个角色
Scrum团队中包括三个角色,他们分别是产品负责人.开发团队和 Scrum Master. Scrum 团队是自组织.跨职能的完整团队.自组织团队决定如何最好地完成他们的工作,而不是由团队外的其他人来 ...