IOS 算法(中級(jí)篇) ----- 最小路徑和

題目: 給定一個(gè)包含非負(fù)整數(shù)的 m x n 網(wǎng)格,請(qǐng)找出一條從左上角到右下角的路徑,使得路徑上的數(shù)字總和為最小。

例如:

輸入:
[
[1,2,3],
[4,5,6],
[7,8,9]
]
輸出: 21
解釋: 因?yàn)槁窂?1→2→3→6→9 的總和最小。

輸入:
[
[1,0,3],
[4,2,1],
[3,2,2]
]
輸出: 6
解釋: 因?yàn)槁窂?1→0→2→1→2 的總和最小。

解題思路

這道題題意思很好理解, 但一些實(shí)際動(dòng)手操作的話也是有點(diǎn)難度

因?yàn)橛袔讉€(gè)很難下手點(diǎn):

每行最小怎么找到?
最小路徑怎么選取?
怎么判斷處理拐點(diǎn)?
因?yàn)轭}目描述是"一條從左上角到右下角的路徑", 所以針對(duì)當(dāng)前單元格(i, j),只用考慮3種情況

左邊界單元格只能從上方單元格移來
上邊界單元格只能從左邊單元格移來
其他情況(i, j) 只能從左邊單元格(i-1, j)或上方單元格(i, j-1)移到
接下來我們做的是, 把原來數(shù)組值替換, 替換到達(dá)這里面的最小值

可以看到
i = 0, j = 0 起點(diǎn)值不變
i ≠ 0, j = 0 左邊界, cgrid[i][j] = cgrid[i-1][j] + cgrid[i][j]
i = 0, j ≠ 0 上邊界, cgrid[i][j] = cgrid[i][j-1] + cgrid[i][j]
i ≠ 0, j ≠ 0 其余情況, 我們?nèi)∽筮呉粋€(gè)單元格, 上面的單元格 兩者之中的最小值
即: cgrid[i][j] = cgrid[i-1][j] < cgrid[i][j-1] ?
cgrid[i-1][j] + cgrid[i][j] : cgrid[i][j-1] + cgrid[i][j]

    func minPathSum(_ grid: [[Int]]) -> Int {
        var cgrid = grid
        for i in 0..<cgrid.count {
            for j in 0..<cgrid[0].count {
                if i == 0 && j == 0 {    
                    continue
                }else if i == 0 {
                    cgrid[i][j] = cgrid[i][j-1] + cgrid[i][j]
                }else if j == 0 {
                    cgrid[i][j] = cgrid[i-1][j] + cgrid[i][j]
                }else {
                    cgrid[i][j] = cgrid[i-1][j] < cgrid[i][j-1] ?
                        cgrid[i-1][j] + cgrid[i][j] : cgrid[i][j-1]  + cgrid[i][j]
                }
            }
        }
        return cgrid[cgrid.count - 1][cgrid[0].count - 1]
    }

題目來源:力扣(LeetCode) 感謝力扣爸爸 :)

IOS 算法合集地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容