动态规划(1)

This commit is contained in:
结发受长生 2018-08-31 23:50:57 +08:00
parent 73993ff8c0
commit d4a52e012d
2 changed files with 40 additions and 2 deletions

View File

@ -1,5 +1,5 @@
---
title: 动态规划
title: 动态规划(1)
date: 2018-8-27 02:17:07
tags:
- 算法
@ -59,4 +59,42 @@ class Solution {
}
```
空间复杂度是`O(1)`, 因为使用了常数个变量, 没有开辟长度为n的新数组
时间复杂度是`O(n)`, 因为要逐个遍历传入的数组当中的元素
时间复杂度是`O(n)`, 因为要逐个遍历传入的数组当中的元素
### 不同路径问题
一个机器人位于一个 m x n 网格的左上角 起始点在下图中标记为“Start”
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角在下图中标记为“Finish”
问总共有多少条不同的路径?
![不同路径问题](/images/算法/robot_maze.png)
#### 解决方式
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
方便进行计算, 当然这个也不是必须的, 在循环当中判断也可以, 但是不影响时间和空间复杂度

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.5 KiB