动态规划(1)
This commit is contained in:
parent
73993ff8c0
commit
d4a52e012d
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: 动态规划
|
title: 动态规划(1)
|
||||||
date: 2018-8-27 02:17:07
|
date: 2018-8-27 02:17:07
|
||||||
tags:
|
tags:
|
||||||
- 算法
|
- 算法
|
||||||
@ -60,3 +60,41 @@ class Solution {
|
|||||||
```
|
```
|
||||||
空间复杂度是`O(1)`, 因为使用了常数个变量, 没有开辟长度为n的新数组
|
空间复杂度是`O(1)`, 因为使用了常数个变量, 没有开辟长度为n的新数组
|
||||||
时间复杂度是`O(n)`, 因为要逐个遍历传入的数组当中的元素
|
时间复杂度是`O(n)`, 因为要逐个遍历传入的数组当中的元素
|
||||||
|
|
||||||
|
### 不同路径问题
|
||||||
|
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为“Start” )
|
||||||
|
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为“Finish”)
|
||||||
|
问总共有多少条不同的路径?
|
||||||
|

|
||||||
|
|
||||||
|
#### 解决方式
|
||||||
|
1. 首先最左上角的格子的到达方式肯定只有1种, 因为必须要从这个格子开始走
|
||||||
|
2. 在每个格子当中只能向右或者向下移动, 所以每个对于每个格子来说, 到达这个格子的时候, 只能从左侧或者上方到达
|
||||||
|
3. 左边缘的格子无法从左侧到达, 上边缘的格子无法从上方到达
|
||||||
|
|
||||||
|
所以对于每个格子来说, 到达这个格子的路径的数量 = 到达左侧格子的数量 + 到达上方格子的数量
|
||||||
|
左边缘的格子前者为0, 上边缘的格子后者为0
|
||||||
|
|
||||||
|
根据这个原则, 就可以把到达每个格子的路径数量递推出来了
|
||||||
|
|
||||||
|
#### 代码实现
|
||||||
|
```java
|
||||||
|
public int uniquePaths(int m, int n) {
|
||||||
|
if(m<=0 || n<=0) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int[][] nums = new int[m+1][n+1];
|
||||||
|
nums[1][1] = 1;
|
||||||
|
for(int i=1 ; i<=m ; i++) {
|
||||||
|
for(int j=1 ; j<=n ; j++) {
|
||||||
|
if(i==1 && j==1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
nums[i][j] = nums[i-1][j] + nums[i][j-1];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nums[m][n];
|
||||||
|
}
|
||||||
|
```
|
||||||
|
整体思路就是创建一个整数二维数组, m+1和n+1是为了留出第一行和第一列数值都是0
|
||||||
|
方便进行计算, 当然这个也不是必须的, 在循环当中判断也可以, 但是不影响时间和空间复杂度
|
||||||
BIN
source/images/算法/robot_maze.png
Normal file
BIN
source/images/算法/robot_maze.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 9.5 KiB |
Loading…
x
Reference in New Issue
Block a user