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. vector迭代器失效的一种情形

    使用过STL的人都应该知道关于迭代器失效的原理,这里以后vector迭代器失效为例: 第一种:当插入一个元素到vector中,如果插入后容器已满,那么容器将新开辟一块内存区域,然后 将原内存中的数据拷 ...

  2. Js数组的操作push,pop,shift,unshift等方法详细介绍

    js中针对数组操作的方法还是比较多的,今天突然想到来总结一下,也算是温故而知新吧.不过不会针对每个方法进行讲解,我只是选择其中的一些来讲. 首 先来讲一下push和pop方法,这两个方法只会对数组从尾 ...

  3. Mac 下纯lua(二)

    Lua库 基本函数 assert(v,[,message]) 当v时false时,返回message assert(money >0,"error -1001"); coll ...

  4. #include<math.h>

    1.sin(a)类:a是弧度值: 2.abs(b):结果是b的绝对值: 3.exp(c):exp()用来计算以e为底的x次方值,即ex值,然后将结果返回.返回值: 返回e的x次方计算结果. 4.log ...

  5. js中的注意事项(持续整理)

    1.兼容性 <div class="toutiao_r fl_r" id ="toutiao_r"></div> 这个div中有两个样式 ...

  6. UGUI Button控件

    今天一起来学习下Button控件, Button控件其实是由Text,Button,Image组件形成的. 这里就简单介绍下Button组件 Interactable: 代表该组件是否进行交互, 我们 ...

  7. 部分和问题(dfs)

    部分和问题 时间限制:1000 ms  |           内存限制:65535 KB 难度:2   描述 给定整数a1.a2........an,判断是否可以从中选出若干数,使它们的和恰好为K. ...

  8. myeclipse集成weblogicserver

    今天为了学一下JMS的东东, 不得不安装个weblogicserver, 下面是详细的安装步骤: 1. 首先去官网下载一个weblogic: 下载地址: http://download.oracle. ...

  9. Kolor Neutralhazer v1.0.2 (照片雾气模糊去除过滤器)+破解RI

    由于空气污染.阴霾几天越来越,根据照片始终是一个灰色,怎么做?有了这个插件.能够解除您的烦恼. Neutralhazer这是消除你的风景照片和雾气模糊的全景图的有效途径photoshop小工具. wa ...

  10. Mysql show Status常用参数详解

    状态名 作用域 详细解释 Aborted_clients Global 由于客户端没有正确关闭连接导致客户端终止而中断的连接数 Aborted_connects Global 试图连接到MySQL服务 ...