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.

思路1:

一上去就觉得是简单题:

如果当前格位于第m行或第n列,则只有一种路径;

否则当前格路径数等于“右格路径数”+“下格路径数”;

代码(未AC):

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

结果提示超时了。

思路2:

考虑超时原因很可能是使用了函数递归,为避免使用递归,新建一个m*n的矩阵空间用于保存每个点计算的路径数。用新建空间保存结果,代替递归。

代码(AC):

 class Solution {
public:
int uniquePaths(int m, int n) {
vector<vector<int> > grid(m, vector<int>(n, ));
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) {
grid[i][j] = grid[i-][j] + grid[i][j-];
}
} return grid[m-][n-];
}
};

思路3:

上述代码时间复杂度o(m*n),空间复杂度o(m*n),通过观察路径数量规律,还可以减少空间复杂度为o(n)。

已知grid[i][j] = grid[i-1][j] + grid[i][j-1];

进一步将后一项grid[i][j-1]替换为grid[i-1][j-1] + grid[i][j-2];

不断查分后一项,最终grid[i][j] = grid[i-1][j] + grid[i-1][j-1] + grid[i-1][j-2] + ... + grid[i-1][1] + grid[i][0];

又因为grid[i][0] = grid[i-1][0] = 1;

所以grid[i][j] 就等于第i-1行,从0到j所有元素之和;

得到了这个规律,我们只需要一个长度为n的数组col,通过第0行计算第1行,并不断迭代,最终得到第m行格子存在的路径数,此时col[n-1]即为所求.

 class Solution {
public:
int uniquePaths(int m, int n) {
vector<int> col(n, );
for (int i = ; i < m; ++i) {
for (int j = ; j < n; ++j) {
col[j] = col[j-] + col[j];
}
} return col[n-];
}
};

思路4:

可以通过分析排列组合暴力求解:

从格子起始,一共需要移动n+m-2步,可以到达终点。

这n+m-2步中,有m-1步需要向下移动。

问题转化为,从n+m-2步中,选择m-1步向下移动,有多少种选择方法。

因此通过计算Combination(n+m-2, m-1)即可求得答案.

代码(超时):

 class Solution {
public:
int uniquePaths(int m, int n) {
long long dividend = ;
long long divisor = ;
for (int i = ; i <= m - ; ++i) {
dividend *= i + n - ;
divisor *= i;
} return int(dividend / divisor);
}
};

代码超时,未AC,正要放弃,看了讨论区的代码..原来用浮点数直接除,结果是正确的;

即(代码AC):

 class Solution {
public:
int uniquePaths(int m, int n) {
double res = ;
for (int i = ; i <= m - ; ++i) {
res = res * (i + n - ) / i;
} return int(res);
}
};

【Leetcode】【Medium】Unique Paths的更多相关文章

  1. 【LeetCode题意分析&解答】40. Combination Sum II

    Given a collection of candidate numbers (C) and a target number (T), find all unique combinations in ...

  2. 【LeetCode题意分析&解答】37. Sudoku Solver

    Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...

  3. 【LeetCode题意分析&解答】35. Search Insert Position

    Given a sorted array and a target value, return the index if the target is found. If not, return the ...

  4. 【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 ...

  5. 【leetcode刷题笔记】Unique Paths II

    Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. How m ...

  6. ACM金牌选手整理的【LeetCode刷题顺序】

    算法和数据结构知识点图 首先,了解算法和数据结构有哪些知识点,在后面的学习中有 大局观,对学习和刷题十分有帮助. 下面是我花了一天时间花的算法和数据结构的知识结构,大家可以看看. 后面是为大家 精心挑 ...

  7. &lt;LeetCode OJ&gt; 62. / 63. Unique Paths(I / II)

    62. Unique Paths My Submissions Question Total Accepted: 75227 Total Submissions: 214539 Difficulty: ...

  8. 动态规划小结 - 二维动态规划 - 时间复杂度 O(n*n)的棋盘型,题 [LeetCode] Minimum Path Sum,Unique Paths II,Edit Distance

    引言 二维动态规划中最常见的是棋盘型二维动态规划. 即 func(i, j) 往往只和 func(i-1, j-1), func(i-1, j) 以及 func(i, j-1) 有关 这种情况下,时间 ...

  9. 【leetcode刷题笔记】Unique Binary Search Trees II

    Given n, generate all structurally unique BST's (binary search trees) that store values 1...n. For e ...

  10. 【leetcode刷题笔记】Unique Binary Search Trees

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

随机推荐

  1. 生成随机32位Token43位asekey

    // 生成随机32位Token字符和43位AseKey var arr = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', ' ...

  2. Comparing deep learning frameworks: Tensorflow, CNTK, MXNet, & Caffe

    https://imaginghub.com/blog/10-a-comparison-of-four-deep-learning-frameworks-tensorflow-cntk-mxnet-a ...

  3. 源码安装caffe2时遇到的问题解决办法

    https://github.com/facebookresearch/DensePose/issues/119

  4. OC总结 【OC基础语法相关知识】

    m是OC源文件扩展名,入口点也是main函数,第一个OC程序: #import <Foundation/Foundation.h> int main(int argc, const cha ...

  5. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

  6. android去除标题栏

    在 AndroidManifast.xml 文件中 将 theme="@style/AppTheme" 改为 theme="@style/Theme.AppCompat. ...

  7. jmeter(1)——环境部署及安装

    公司人事还有老大都找我谈了一下2019的目标和技能成长规划,所以整体想了一下,技能方面,自己今年准备从性能测试开始着手,也去咨询了一下大神,切入点最好是工具.性能测试是一门非常庞大的课程,最初级,最入 ...

  8. Windows Server 2008系统中IE8启用和禁用JS

    Windows Server 2008系统中IE8默认是启用IE ESC(ie 增强)的,这样会导致该IE不支持JS,开启方法: 1.开始->管理工具->服务器管理器 2.点击服务器管理- ...

  9. show_space

    create or replace procedure show_space( p_segname_1 in varchar2,p_space in varchar2 default 'AUTO',p ...

  10. Hibernate生成数据库表

    首先创建实体类 import java.util.Date; public class ProductionEntity { public Integer getId() { return id; } ...