62. Unique Paths(中等,我自己解出的第一道 DP 题^^)
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?
有个图来着,Markdown贴起来很麻烦.不贴了.
Above is a 3 x 7 grid. How many possible unique paths are there?
Note: \(m\) and \(n\) will be at most 100.
解题思路,没啥可说, 用 dynamic programming.
步骤:
step 1: 看 https://mp.weixin.qq.com/s/0AgJmQNYAKzVOyigXiKQhA, 动态规划入门最好材料,没有之一! 10分钟看完,然后第二步.
step 2: 画图自己做这个题.^^
主要是先建模型,既,分析出:
- 状态转移公式,本题有3个状态转移公式,分别对应这i,j条件.具体参考最下方的代码(简单递归,当然无法执行,因为时间复杂度为 \(O(2^n)\), 但能很好的展示了转移公式);
- 最优子结构(分别对应各自的状态转移公式);
- 边界,既
F[0,0] = 1.
自己想法,自个代码^^:
\(O(m*n)\) time, \(O(n)\) extra space.
class Solution {
public:
// 真正的DP求解
// $O(m*n)$ time, $O(n)$ extra space.
// 时间复杂度无法再小了,但空间复杂度还可以再小.
// space complexity 最低可为 min(m, n);
// 听说有 $O(1)$ 的空间复杂度?
// 如果不用 DP, 可用 math 的方法,如下:
// https://leetcode.com/problems/unique-paths/discuss/
int uniquePaths(int m, int n) {
if(m == 1 || n == 1) return 1;
if(m < n) return uniquePaths(n, m);
vector<int> temp(n - 1, 0);
for(int i = 1; i < m; i++){
for(int j = 1; j < n; j++){
if(i == 1 && j == 1) temp[0] = 2;
else if(i == 1 && j > 1) temp[j - 1] = 1 + temp[j - 2];
else if(i > 1 && j == 1) temp[0] = temp[0] + 1;
else if(i > 1 && j > 1) temp[j - 1] = temp[j - 1] + temp[j - 2];
}
}
return temp[n - 2];
}
};
下面是简单递归,但 time complexity \(O(2^n)\), 太高了.
下面代码可清晰地展示出DP的三要素:
状态转移公式、最优子结构和边界.
class Solution {
public:
// 方法一: 简单递归,但 time complexity $O(2^n)$, 太高了.
int uniquePaths(int m, int n) {
int i = m - 1, j = n - 1;
if(i == 0 && j == 0) return 1;
else if(i == 0 && j != 0) return uniquePaths(i, j - 1);
else if(j == 0 && i != 0) return uniquePaths(i - 1, j);
else if(j > 0 && i > 0) return uniquePaths(i, j - 1) + uniquePaths(i - 1, j);
}
};
随机推荐
- Spring中获取request的几种方法,及其线程安全性分析
前言 本文将介绍在Spring MVC开发的web系统中,获取request对象的几种方法,并讨论其线程安全性. 原创不易,如果觉得文章对你有帮助,欢迎点赞.评论.文章有疏漏之处,欢迎批评指正. 欢迎 ...
- 新手解决jsp页面<%@报错的方法
昨天菇凉我很崩溃的重装电脑系统(嗯,没错,第一次自己装系统,我可能是一个假的计算机系学生!),但这没难倒天生聪慧的我,都是小case~.这都不是重点,重点来了,当我火速配置好java的开发环境jdk, ...
- django 配置URLconf和获取值
django中正确配置url匹配找到视图: 1 在项目下的settings.py中ROOT_URLCONF = "项目名.urls" 表示 前台发来请求会先去项目下的test3/u ...
- SendMessage 遇到的神坑
场景 两个进程A和B,需要从A中设置B中的文本框的内容 过程 x.x.x.x. 成功获取了B中的内容,惊喜,离成功更近异步 xxxx ***** ....... x.x.x.x. 大约查找了几百个网页 ...
- codeforces 761B Dasha and friends
https://vjudge.net/problem/CodeForces-761B 题意: 有一个圆形跑道,上面有若干个障碍,分别给出两个人距离障碍的距离,问这两个人是否是在同一个跑道上跑步(我是这 ...
- 1.6 dropout正则化
除了L2正则化,还有一个非常实用的正则化方法----dropout(随机失活),下面介绍其工作原理. 假设你在训练下图左边的这样的神经网络,它存在过拟合情况,这就是dropout所要处理的.我们复制这 ...
- [转]最常用的15大Eclipse开发快捷键技巧
作者:Java我人生(陈磊兴) 原文出处http://blog.csdn.net/chenleixing/article/details/44600587 做Java开发的,经常会用Eclipse ...
- [转]XHR简介
在XHR诞生前,网页要获取客户端和服务器的任何状态更新,都需要刷新一次,在XHR诞生后就可以完全通过JS代码异步实现这一过程.XHR的诞生也使最初的网页制作转换为开发交互应用,拉开了WEB2.0的 ...
- mysql数据库--explain(查询表是否走索引)各个字段含义
1.1 id列 数字越大越先执行,如果说数字一样大,那么就从上往下依次执行,id列为null的就表是这是一个结果集,不需要使用它来进行查询. 1.2 select_type列 常见的有: ◆ simp ...
- Azure AI 服务之文本翻译
当下人工智能可谓是风头正劲,几乎所有的大厂都有相关的技术栈.微软在 AI 领域自然也是投入了重注,并且以 Azure 认知服务的方式投入了市场: 也就是说作为开发者我们不需要学习太多 AI 的理论知识 ...