题目是这样的:
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)。
问总共有多少条不同的路径?

例如:

输入: m = 3, n = 2
输出: 3
解释:
从左上角开始,总共有 3 条路径可以到达右下角。
1. 向右 -> 向右 -> 向下
2. 向右 -> 向下 -> 向右
3. 向下 -> 向右 -> 向右

输入: m = 7, n = 3
输出: 28

这道题其实跟那个踩阶梯的题很相似:“假如有10步台阶,一次可走一步或两步,那么要走到达台阶顶,有几种走法,我们都知道,这个是斐波那契问题,递归就可以了”。
我们可以这么解,假设最后一格是a[m][n],那么能到达a[m][n]的只有a[m-1][n]和a[m][n-1]。同理,要到达a[m-1][n],也只能从a[m-1-1][n]和a[m-1][n-1];
要到达a[m][n-1],也只能从a[m-1][n-1]和a[m][n-1-1],这是个递归问题。直到a[i][j]中i=1或者j=1,当i=1时,就只可以能时从a[i][j-1]到达,当j=1时,同样,也只能从a[i-1][j]到达;
于是,递归的边界找到了。
可能上面说的不直观,请看下面:
```
r(m,3)的值       r(m,4)的值   r(m,4)-r(m-1,4)的差值
r(1,3)=1         r(1,4)=1         3
r(2,3)=3         r(2,4)=4         6 
r(3,3)=6         r(3,4)=10       10
r(4,3)=10        r(4,4)=20       15  
r(5,3)=15        r(5,4)=35       21  
r(6,3)=21        r(6,4)=56       28  
r(7,3)=28        r(7,4)=84       36  
r(8,3)=36        r(8,4)=120      45  
r(9,3)=45        r(9,4)=165
有没有发现
r(9,4)=r(8,4)+45=r(8,4)+r(9,3)=r(7,4)+r(8,3)+r(8,3)+r(9,2)
r(8,4)=r(7,4)+36=r(7,4)+r(8,3)=r(6,4)+r(7,3)+r(7,3)+r(8,2)
.
.
.
.
.
```
于是我们很快想到了递归函数怎么写:
```
public int uniquePaths2(int m, int n) {
if (m == 1) {
return 1;
}
if (n == 1) {
return 1;
}
return uniquePaths2(m - 1, n) + uniquePaths2(m, n - 1);
}
```
运行一下:
结果对了,现在把参数值变大一点:
时间还凑合,再变大,这次运行时间有点久了:
超过了两分钟!
为什么呢,请看上面的发现那里:在我们计算r(9,4)的时候是不是中间会计算两次r(8,3),并且r(8,4)和r(9,4)中间都会有r(7,4)的计算,而这些重复计算是很浪费时间的。对这块不了解的可以看这篇文章:https://mp.weixin.qq.com/s/llvtdxaPc29CNkcmtPHxKw
于是,为了避免重复计算,这个函数需要改写,我们可以这样,在计算r(8,3)的时候把r(8,3)的值保存起来,这样下次计算r(8,3)的值的时候可以直接获取,不需要再计算了,根据这个思路,把算法改良一下:
```
public int uniquePaths3(int m, int n) {
int[][] all = new int[m][n];
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (i == 0 || j == 0) {
all[i][j] = 1;
} else {
all[i][j] = all[i - 1][j] + all[i][j - 1];
}
}
}
return all[m - 1][n - 1];
}
```
再看看运行结果:
快了好多是不是!

转载于:https://www.cnblogs.com/aibaofeng/p/11098525.html

LeetCode题解相关推荐

  1. 900 多道 LeetCode 题解,这个 GitHub 项目值得 Star!

    转自 | 码农有道 大家好,我是小 G. 周末风和日丽,适合刷 LeetCode 今天给你们推荐个 GitHub 项目,里面收集了 900 多道 LeetCode 题解,并包含中英文两个版本,适合大多 ...

  2. PHP版Leetcode题解开始随缘更新

    2019独角兽企业重金招聘Python工程师标准>>> PHP版Leetcode题解 我叫skys215,是一名bug工程师. 我接触编程的时间比较早,但是因为我数学不好加上比较懒, ...

  3. [LeetCode 题解]: Binary Tree Preorder Traversal

    前言 [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a binary ...

  4. LeetCode 题解汇总

    为什么80%的码农都做不了架构师?>>>    LeetCode 题解汇总 转载于:https://my.oschina.net/michao/blog/801863

  5. leetcode题解【持续更新】

    leetcode题解不断更新,以及nowcoder题解.一起加油! 完整请移步我的Github 转载于:https://juejin.im/post/5c8a73d8f265da2de80fa774

  6. 32位有符号整数_008. 字符串转换整数 (atoi) | Leetcode题解

    点击上方"蓝色字体",选择"设为星标" 每天复习一道面试题,轻松拿大厂Offer~ 题目描述: 请你来实现一个 atoi 函数,使其能将字符串转换成整数. 首先 ...

  7. leetcode题解132-分割回文串 II

    问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文. 返回符合要求的 最少分割次数 . 示例 1: 输入:s = "aab" 输出:1 解释:只需一次分割 ...

  8. leetcode题解131-分割回文串

    问题描述 给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是 回文串 .返回 s 所有可能的分割方案. 回文串 是正着读和反着读都一样的字符串. 示例 1: 输入:s = "aa ...

  9. [LeetCode 题解]: Roman to Interger

    前言 [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html 1.题目描述 Given a roman ...

  10. 【LeetCode题解】二叉树的遍历

    我准备开始一个新系列[LeetCode题解],用来记录刷题,顺便复习一下数据结构与算法. 1. 二叉树 二叉树(binary tree)是一种极为普遍的数据结构,树的每一个节点最多只有两个节点--左孩 ...

最新文章

  1. do{}while(0) 作用
  2. mysql 编译_mysql 5.7 编译——VS2017
  3. java 找不到或无法加载主类- 解决方案
  4. Linux疑难杂症解决方案100篇(八)-文本处理工具与bash的特性
  5. 【数据算法】Java实现二叉树存储以及遍历
  6. heima Oracle day2
  7. keepalived(6)——lvs和arrp集成操作(2)——完成
  8. 家用光纤猫设备、光纤收发器和光电交换机介绍
  9. 读C#开发实战1200例子记录-2017年8月14日10:03:55
  10. zip伪加密破解方法
  11. HDFS Shell基本操作总结
  12. Linux思维导图之inode、mv、cp和硬软链接
  13. Windows Workflow Foundation之旅(六)——框架组成、工作流创作模式
  14. 帆软报表 修改 加载中 文字
  15. C语言中的空字符'\0'
  16. vue 前端使用 element-ui 实现省市级联动
  17. 推荐系统实战--movieslens数据集实现UserCF算法
  18. 使用调色板(Palette)API 获取颜色
  19. appium driver参数及命令行参数
  20. 给你的Potplayer设置老板键

热门文章

  1. 五行塔怎么吃第五个_中医美容——“五行美容养颜法”,善用五行,女人会越来越漂亮...
  2. 排序算法之----快速排序(快速上手快速排序)
  3. 众友科技计算机组成原理,组成原理:采用微程序控制器的模型机CPU设计(10页)-原创力文档...
  4. python函数之作用域
  5. mysql master 监控_可用于监控 mysql Master Slave 状态的python代码
  6. android 清理工具,Android 版 Avira Optimizer 是 Android 手機清理工具
  7. mysql注册slave_创建slave库?spm=a2c4e.11155472的搜索结果-阿里云开发者社区
  8. MySQL添加、更新、删除数据
  9. java练习(数组工具类的封装)[目前写过最长的代码,虽然不难]
  10. ENSP配置 实例七 DHCP配置