題目描述
leetcode地址
一個機器人從m x n
的矩陣左上角出發,到達矩陣的右下角,它每次只能前進一格,且只能向右走或者向下走,問:它有多少種方式走到終點?
/**
* @param {number} m 矩陣的行數
* @param {number} n 矩陣的列數
* @return {number}
*/
var uniquePaths = function(m, n) {
// Your code.
};
題目分析
題目說機器人只能向下走,或者向右走,那么當機器人走到最后一行時,它只有一種前進方式,當機器人走到最后一列時,它同樣只有一種前進方式,如下圖:
image.png
現在我們按上面的思路,畫個表格,表格中的值表示前進的方式,那么我們可以得到:
image.png
再考慮一下當機器人位于其它位置時,它的前進方式有且僅有兩種:
image.png
那么我如何知道一個隨機位置前進的方式呢?再嘗試畫幾個位置:
image.png
如圖的(a),記(a)位置的坐標是(i, j),那么反過來看,如果是從終點向(a)靠近,有幾條路線呢?很明顯從起點出發只能向下或向右,那么從終點出發就只能向上或向左,只有2條路線到達(a),滿足公式(i, j) = (i+1, j) + (i, j+1)
。
再如圖中的(b),終點向(b)靠近,有幾條路線呢?
image.png
一條經過(a),一條不經過(a),經過(a)的路線有2條,記(b)的坐標是(i, j),則滿足公式:(i, j) = (i+1, j) + (i, j+1) = (ai, aj) + (i, j+1) = 3
我們可以將狀態一直向前推進,直到出發點。最后,出發點上的數值就是路線的總數。
SHOW ME THE CODE
/**
* @param {number} m 矩陣的行數
* @param {number} n 矩陣的列數
* @return {number}
*/
var uniquePaths = function(m, n) {
let dp = []
// 初始化
for(let i = 0; i < m; i++) {
dp[i] = []
}
// 初始值
for(let i = 0; i < m; i++) {
dp[i][n-1] = 1;
}
for(let i = 0; i < n; i++) {
dp[m-1][i] = 1;
}
// 狀態轉移
for(let i = m-1; i >= 0; i--) {
for(let j = n-1; j >= 0; j--) {
dp[i][j] = dp[i+1][j] + dp[i][j+1]
}
}
return dp[0][0]
};
復雜度分析
時間復雜度:O(m*n)
空間復雜度:O(m*n)