博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[LeetCode] Unique Paths
阅读量:5034 次
发布时间:2019-06-12

本文共 3074 字,大约阅读时间需要 10 分钟。

This is a fundamental DP problem. First of all, let's make some observations.

Since the robot can only move right and down, when it arrives at a point, there are only two possibilities:

  1. It arrives at that point from above (moving down to that point);
  2. It arrives at that point from left (moving right to that point).

Thus, we have the following state equations: suppose the number of paths to arrive at a point (i, j) is denoted as P[i][j], it is easily concluded that P[i][j] = P[i - 1][j] + P[i][j - 1].

The boundary conditions of the above equation occur at the leftmost column (P[i][j - 1] does not exist) and the uppermost row (P[i - 1][j] does not exist). These conditions can be handled by initialization (pre-processing) --- initialize P[0][j] = 1, P[i][0] = 1 for all valid i, j. Note the initial value is 1 instead of 0!

Now we can write down the following (unoptimized) code.

1 class Solution {2     int uniquePaths(int m, int n) {3         vector
> path(m, vector
(n, 1));4 for (int i = 1; i < m; i++)5 for (int j = 1; j < n; j++)6 path[i][j] = path[i - 1][j] + path[i][j - 1];7 return path[m - 1][n - 1];8 }9 };

As can be seen, the above solution runs in O(n^2) time and costs O(m*n) space. However, you may have observed that each time when we update path[i][j], we only need path[i - 1][j](at the same column) and path[i][j - 1] (at the left column). So it is enough to maintain two columns (the current column and the left column) instead of maintaining the full m*n matrix. Now the code can be optimized to have O(min(m, n)) space complexity.

1 class Solution { 2     int uniquePaths(int m, int n) { 3         if (m > n) return uniquePaths(n, m);  4         vector
pre(m, 1); 5 vector
cur(m, 1); 6 for (int j = 1; j < n; j++) { 7 for (int i = 1; i < m; i++) 8 cur[i] = cur[i - 1] + pre[i]; 9 swap(pre, cur);10 }11 return pre[m - 1];12 }13 };

Further inspecting the above code, we find that keeping two columns is used to recover pre[i], which is just cur[i] before its update. So there is even no need to use two vectors and one is just enough. Now the space is further saved and the code also gets much shorter.

1 class Solution { 2     int uniquePaths(int m, int n) { 3         if (m > n) return uniquePaths(n, m); 4         vector
cur(m, 1); 5 for (int j = 1; j < n; j++) 6 for (int i = 1; i < m; i++) 7 cur[i] += cur[i - 1]; 8 return cur[m - 1]; 9 }10 };

Well, till now, I guess you may even want to optimize it to O(1) space complexity since the above code seems to rely on only cur[i] and cur[i - 1]. You may think that 2 variables is enough? Well, it is not. Since the whole cur needs to be updated for n - 1 times, it means that all of its values need to be saved for next update and so two variables is not enough.

转载于:https://www.cnblogs.com/jcliBlogger/p/4548046.html

你可能感兴趣的文章
类模板 - C++快速入门45
查看>>
[转载]JDK的动态代理深入解析(Proxy,InvocationHandler)
查看>>
centos7 搭建vsftp服务器
查看>>
RijndaelManaged 加密
查看>>
Android 音量调节
查看>>
HTML&CSS基础学习笔记1.28-给网页添加一个css样式
查看>>
windows上面链接使用linux上面的docker daemon
查看>>
Redis事务
查看>>
Web框架和Django基础
查看>>
python中的逻辑操作符
查看>>
关于tomcat下startup.bat双击闪退的问题
查看>>
CSS兼容性常见问题总结
查看>>
HDU 1548 A strange lift (Dijkstra)
查看>>
每天一个小程序—0005题(批量处理图片大小)
查看>>
C# 启动进程和杀死进程
查看>>
tcp实现交互
查看>>
IIS的各种身份验证详细测试
查看>>
JavaScript特效源码(3、菜单特效)
查看>>
聊聊、Zookeeper Linux 单服务
查看>>
Linux常用命令总结
查看>>