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. hibernate安装和配置和第一个Hibernate应用

    ssh的各个版本要搭配好,struts2.3一般搭配hibernate4.x,我下的是4.3. Hibernate4的改动较大只有spring3.1以上版本能够支持,Spring3.1取消了Hiber ...

  2. python list列表 方法总结

    深入链表(most on lists) The list data type has some more methods. Here are all of the methods of list ob ...

  3. jQuery UI 之 LigerUI 快速入门

    LigerUI 快速开发UI框架 LigerUI 是基于jQuery 的UI框架,其核心设计目标是快速开发.使用简单.功能强大.轻量级.易扩展.简单而又强大,致力于快速打造Web前端界面解决方案,可以 ...

  4. 转化率最高的16个WordPress 电子商务主题

    想自己开一个WordPress的电子商务商店?下面我们分享转化率最高的16个WordPress 电子商务主题,它们拥有最棒的用户体验,集成最新的用户体验,慢慢欣赏吧! 原文地址:http://thet ...

  5. LaTex 下编译后不能显示中文,或者中文乱码

    在 Sublime Text 中编辑以下文件并保存(第一行的注释很重要),按下 Cammand + B 编译: %!TEX program = xelatex \documentclass[UTF8] ...

  6. Impala 2、Impala Shell 和 Impala SQL

    1.Impala 外部 Shell Impala外部Shell 就是不进入Impala内部,直接执行的ImpalaShell 例如通过外部Shell查看Impala帮助可以使用: $ impala-s ...

  7. asp数组的使用

    定义简单数组 有两种方法在asp中定义和初始化数组,让我们看看每种的例子: 方法一:MyArray = Array("Jan","Feb","Mar& ...

  8. jquery 绑定动态元素

    以一个小例子来简单说明下情况 ? 1 2 3 4 5 6 7 8  <script src="jquery-1.11.0.min.js"></script> ...

  9. Spring的AOP2

    本文是<AOP 那点事儿>的续集. 在上篇中,我们从写死代码,到使用代理:从编程式 Spring AOP 到声明式 Spring AOP.一切都朝着简单实用主义的方向在发展.沿着 Spri ...

  10. java一个简单的管理系统

    用java实现的简单管理系统 运行出来的状态 实现了新增.删除.借出.归还.排行榜简单的功能! 下面是简单的代码 首先定义一个书籍类,自己打开哦! public class Book implemen ...