diff --git a/source/_posts/算法/动态规划.md b/source/_posts/算法/动态规划(1).md similarity index 60% rename from source/_posts/算法/动态规划.md rename to source/_posts/算法/动态规划(1).md index 188244d..c926097 100644 --- a/source/_posts/算法/动态规划.md +++ b/source/_posts/算法/动态规划(1).md @@ -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)`, 因为要逐个遍历传入的数组当中的元素 \ No newline at end of file +时间复杂度是`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 +方便进行计算, 当然这个也不是必须的, 在循环当中判断也可以, 但是不影响时间和空间复杂度 \ No newline at end of file diff --git a/source/images/算法/robot_maze.png b/source/images/算法/robot_maze.png new file mode 100644 index 0000000..ebcd2dc Binary files /dev/null and b/source/images/算法/robot_maze.png differ