動態規劃學習--- 矩陣查找唯一路徑

題目描述

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)

擴展練習

leetcode: 查找最小路徑和

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容