持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
1.题目
一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。
机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。
问总共有多少条不同的路径?
示例 1:
输入:m = 3, n = 7
输出:28
2.思路
本题需要机器人能够从左上角移动到右下角的路径数量,我们首先可以想到一种可能,把每一条路都走一遍,然后设定边界值,通过递归的方式把每条路每个方向都走一遍,只要走到右下角就把路径加一,这样就能得到最终的结果了。
var uniquePaths = function(m, n) {
if(m===1&&n===1){
return 1
}
let total = 0
let deep = (x,y,dire)=>{
if((dire==='r'&&x===m-1)||(dire==='d'&&y===n-1)){
return
}
if(dire==='r'){
x=x+1
}
if(dire==='d'){
y=y+1
}
if(x === m-1&&y===n-1){
total+=1
return
}
deep(x,y,'r')
deep(x,y,'d')
}
deep(0,0,'r')
deep(0,0,'d')
return total
};
这样虽然能解决问题,但是有个很致命的漏洞,当数量较为庞大的时候,递归所需要的时间开销就会越来越大,让人无法接受,我们观察在递归的过程中出现了一个规律,那就是到达右下角这个位置的前提是必须要到达右下角的上一位或者左一位,那么到达右下角位置的路径就是到达上一位和左一位的路径之和。
这么一想,这不就是动态规划的思路嘛,每一个问题都能分解成更小的问题了解决,这样我们只需要找到状态转移方程就好了,就是dp(m,n)=dp(m-1,n)+dp(m,n-1),而dp(0,0)=1,同样dp(x,0)=1,dp(0,y)=1,这样我们可以用一个二维数组来存放每一个位置的路径和,然后一步一步计算到目标位置为止。
var uniquePaths = function(m, n) {
let map = new Array(m).fill(0).map(()=>new Array(n).fill(0))
for(let i = 0;i<m;i++){
map[i][0] = 1
}
for(let i = 0;i<n;i++){
map[0][i] = 1
}
for(let i = 1;i<m;i++){
for(let j = 1;j<n;j++){
map[i][j] = map[i-1][j]+map[i][j-1]
}
}
return map[m-1][n-1]
};