Unique Paths

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?

Above is a 3 x 7 grid. How many possible unique paths are there?

Note:m and n will be at most 100.

计算从起点到终点的最短距离。

(动态规划的题目,没错我开始学DP了……)

解题思路:

因为题目中提到了每一次只能向右或者向下移动,所以以终点为例,记为C(3,7),则能到达终点的点分别是A(3,6)和B(2,7),即从起点到达终点的路径数等于从起点到达A点和B点路径数量的和。C = A + B。

有了这一点,接下来就很好想了。

这一题说起来是动态规划,其实还是算挺简单的,他有好几种做法。

首先我刚刚看到这一题的时候,想法是这样的:

动态创建一个m行n列的数组p,存储每一个位置到起点的路径数量。

因为所有与起点start同一行上的点和同一列上的点到起点的路径只有一条,就是一条直线。所以p[0][0~n-1]和p[0~m-1][0]全部置为1。然后根据每一个位置等于它左边的值与上边的值的和就很好计算了。

比较好的一点是,这种看起来低端不上档次的方法还避免了动态规划方法的重复计算问题。

代码如下:

class Solution {
public:
int uniquePaths(int m, int n) {
if(m == || n == )
return ;
//动态创建二维数组
int **p;
p = new int*[m];
for(int i = ; i < m; i++){
p[i] = new int[n];
}
for(int i = ; i < m; i++)
for(int j = ; j < n;j++)
p[i][j] = ; //初始化第一行为1
for(int i = ; i < n; i++){
p[][i] = ;
}
//初始化第一列为1
for(int i = ; i < m; i++){
p[i][] = ;
}
//从第二行第二列开始计算每一格
for(int i = ; i < m; i++){
for(int j = ; j < n; j++){
p[i][j] = p[i][j-] + p[i-][j];
}
} int ret = p[m-][n-]; for(int i = ; i < m; i++)
delete[] p[i];
delete[] p; return ret;
}
};

接下来就是高端大气上档次滴采用递归的动态规划的解法了。或者叫做回溯法。

如果是这样子写:

class Solution {
public:
int uniquePaths(int m, int n) {
if(m == || n == )
return ;
return uniquePaths(m,n-)+uniquePaths(m-,n);
}
};

那么提交上去……

显示 超时 !

原因很简单,因为存在大量的重复计算!

所以我们还是需要维护一个二维数组来避免同一个位置的值重复计算。当某个值已经被计算出来,下次再用到这个值时,直接取就可以不用再去计算了。

所以代码变成了这样子:

const int M_MAX = ;
const int N_MAX = ; class Solution { public:
int uniquePaths(int m, int n) {
int mat[M_MAX+][N_MAX+];
for(int i = ; i < M_MAX+; i++){
for(int j = ; j < N_MAX+; j++){
mat[i][j] = -;
}
}
return backtrack(m,n,mat);
} int backtrack(int m,int n,int mat[][N_MAX+]){
if(m == || n == )
return ;
if(mat[m][n-] == -)
mat[m][n-] = backtrack(m,n-,mat);
if(mat[m-][n] == -)
mat[m-][n] = backtrack(m-,n,mat);
return mat[m][n-] + mat[m-][n];
}
};

我们知道以上的空间复杂度是 O(m * n)。

接下来的这种动态规划的空间复杂度是O(min(m , n))。

非常有意思。

public static int uniquePathsDP(int m, int n){
int x = Math.min(m, n);
int y = Math.max(m, n);
int[] ret = new int[x]; for(int i = ; i < x; i++)
ret[i] = ; for(int i = ; i < y; i++)
for(int j = ; j < x; j++)
{
ret[j] += ret[j - ];
} return ret[x - ];
}

注:

动态创建二维数组的代码,因为我总是记不住,就此记录:

char **a;
a = new char* [m];//分配指针数组
for(int i=; i<m; i++)
{
a[i] = new char[n];//分配每个指针所指向的数组
} printf("%d\n", sizeof(a));//4,指针
printf("%d\n", sizeof(a[]));//4,指针 for(i=; i<m; i++)
delete[] a[i];
delete[] a;

【LeetCode练习题】Unique Paths的更多相关文章

  1. LeetCode 63. Unique Paths II不同路径 II (C++/Java)

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

  2. [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 ...

  3. 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 ...

  4. [LeetCode] 63. Unique Paths II_ Medium tag: Dynamic Programming

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

  5. [Leetcode Week12]Unique Paths II

    Unique Paths II 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/unique-paths-ii/description/ Descrip ...

  6. [Leetcode Week12]Unique Paths

    Unique Paths 题解 原创文章,拒绝转载 题目来源:https://leetcode.com/problems/unique-paths/description/ Description A ...

  7. [LeetCode] 63. Unique Paths II 不同的路径之二

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

  8. [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 ...

  9. leetcode 62. Unique Paths 、63. Unique Paths II

    62. Unique Paths class Solution { public: int uniquePaths(int m, int n) { || n <= ) ; vector<v ...

  10. 【leetcode】Unique Paths

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

随机推荐

  1. SmartBusinessDevFramework架构设计-3:考虑开源?

    掖着藏着,终归不是好的办法.说的跟花一样,究竟里子是什么东西.一个好的被子,里料是羽绒还是棉花还是丝绵还是黑心棉?有时候,真的是看过之后,才能体验其中的奥秘. 这个架构的设计初衷,总体是为了方便.ne ...

  2. 【转】 linux内核移植和驱动添加(三)

    原文网址:http://blog.chinaunix.net/uid-29589379-id-4708909.html 原文地址:linux内核移植和驱动添加(三) 作者:genehang 四,LED ...

  3. 安装开源项目 MultiType (基于 RecyclerView)出现的各种问题 -- 自己的第一篇博客

    一.引入开源项目的方式 使用开源项目 MultiType 的两种方式: 1.maven引入:在主Module 的 build.gradle 中加入 dependencies { ...... comp ...

  4. android系统的图片资源

    使用系统的图片资源的好处有,一个是美工不需要重复的做一份已有的图片了,可以节约不少工时:另一个是能保证我们的应用程序的风格与系统一致. 1.引用方式 在源代码*.Java中可以进入如下方式引用: my ...

  5. java 防止sql注入的方法(非原创)

      一.SQL注入简介       SQL注入是比较常见的网络攻击方式之一,它不是利用操作系统的BUG来实现攻击,而是针对程序员编程时的疏忽,通过SQL语句,实现无帐号登录,甚至篡改数据库. 二.SQ ...

  6. 学生管理系统(list)

    学生管理系统:学习了一点文件指针的操作和链表操作,以前总想搞下子,刚好碰到同学要做这个,自己瞎搞了一通. 实现功能:数据添加,查找,删除,插入,修改只是在查找加几句就没写. #include < ...

  7. openssl CA 自签证书,阿里云配置tomcat https

    <一,openssl CA自签发证书> 1,生成私钥 openssl genrsa 1024 > private.key;

  8. Android Project from Existing Code 生成 R 文件错误、失败等问题解决办法 - 持续更新

    Android Project from Existing Code 生成 R 文件错误.失败等问题解决办法 - 持续更新 git  上的项目,pull下来之后用Android Project fro ...

  9. mysql binlog参数设置

    1.mysql有许多系统变量,可以设置,系统变量设置不同,不同的系统将导致执行状态. 故mysql提供两组命令,分别查看系统设置和执行状态. 1.系统设置: SHOW [GLOBAL | SESSIO ...

  10. 【计算几何初步-线段相交+并查集】【HDU1558】Segment set

    Segment set Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Tota ...