LeetCode偶爾一題 —— 64. 最小路徑和

題目描述

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和爲最小。
說明:每次只能向下或者向右移動一步。 示例:javascript

輸入:
[
[1,3,1],
[1,5,1],
[4,2,1]
]
輸出: 7
解釋: 由於路徑 1→3→1→1→1 的總和最小。前端

分析題目

遞歸

對於有些題目,若是咱們一會兒想不出來解題思路,其實能夠稍微對它分析一下,那麼天然就會找到解題的辦法。
根據題中描述,咱們知道每次只能向下或者向右移動一步,咱們以此爲依據畫出示例中全部可能的路徑👇java

很明顯這是一個樹形結構,咱們只要算出每一個頭結點葉子結點所通過的路徑和,它們中最小的值就是題目中要求的最小路徑和,所以咱們能夠嘗試用深度優先搜索來解決它,初版程序👇git

var minPathSum = function (grid) {
    return dfs(0, 0)
    function dfs (i, j) {
        if (i === grid.length || j === grid[0].length) {
            return Number.MAX_SAFE_INTEGER
        }
        if (i === grid.length - 1 && j === grid[0].length - 1) {
            return grid[i][j]
        }
        return grid[i][j] + Math.min(dfs(i + 1, j), dfs(i, j + 1))
    }
}
複製代碼

動態規劃

細心的你可能已經發現,這道題其實能夠把它分解爲一個個子問題,而咱們只要解決了子問題,那麼只要把子問題合併起來就能給出解。
怎麼說呢?原題目讓咱們求到 grid[i][j] 的最小路徑,那麼咱們只要找到 grid[i][j]上一個或者左一個中和它加起來最小的一個。換成代碼也就是求👉 min = Math.min(grid[i][j] + grid[i - 1][j], gird[i][j] + grid[i][j-1])github

具體實現以下👇微信

var minPathSum = function(grid) {
    let x = grid.length - 1, y = grid[0].length - 1
    for (let i = 0; i <= x; i++) {
        for (let j = 0; j <= y; j++) {
            let tmp = grid[i][j]
            if (j === 0) {
                if (i > 0) {
                    grid[i][j] = grid[i - 1][j] + tmp
                }
            } else {
                if (i > 0) {
                    grid[i][j] = Math.min(grid[i - 1][j] + tmp, grid[i][j - 1] + tmp)
                } else {
                    grid[i][j] = grid[i][j - 1] + tmp
                }
            }
        }
    }
    return grid[x][y]
};
複製代碼

原題地址: leetcode-cn.com/problems/mi… 代碼不定時更新,歡迎 star 個人 repoui

掃描下方的二維碼或搜索「tony老師的前端補習班」關注個人微信公衆號,那麼就能夠第一時間收到個人最新文章。 spa

相關文章
相關標籤/搜索