1. 程式人生 > >【python】【leetcode】【演算法題目64—Minimum Path Sum】

【python】【leetcode】【演算法題目64—Minimum Path Sum】

題目描述

題目原文:

Given a m x n grid filled with non-negative numbers, find a path from top left to bottom right which minimizes the sum of all numbers along its path.

Note: You can only move either down or right at any point in time.

給定一個 M×N 的,元素為非負數的矩陣,找出從左上角元素到左下角元素經過的最短路徑,並輸出。

注意:其實note很有用的,只能向右走或者向下走。恩~若有所思~

題目分析

思路:

(錯誤:期初我想既然每次只能往右或者往下走,那我每次只需要比較一下右面和下面方格的值哪個小選哪個就可以了,但是細想區域性最優≠整體最優,大家簡單畫個圖就知道了~)

從頭捋捋,假設M和N都很大,只能向右走,那麼第一行的每個方格的最短路徑的唯一確定的,長度即為當前方格內數字加上列數在當前方格之前的所有方格內數字之和;第一列同理。那麼要求第二行第二列方格的最短路徑:只需要比較一下第一行第二列方格最短路徑值與第二行第一列方格的最短路徑值哪一個更小,小的數值加上當前方格內數值即為所求.......要求第i行第j列方格的最短路徑:只需要比較一下第i行第j-1列方格最短路徑值與第i-1行第j列方格的最短路徑值哪一個更小,小的數值加上當前方格內數值即為所求。

所以最終思路為:迴圈M×N方格矩陣,依次求出從左上角方格到當前的最短路徑並記錄在當前方格中,直至運算到右下角方格即可。

Python程式碼

class Solution(object):
    def minPathSum(self, grid):
        """
        :type grid: List[List[int]]
        :rtype: int
        """
        # 求出矩陣行列數:m為行數n為列數 
        m = len(grid)
        n = len(grid[0])
        
        # 計算左上角方格到第一行每個方格的最短路徑值,並用該值更新當前方格儲存值。
        for i in range(1, n):
            grid[0][i] += grid[0][i-1] 
            
        # 計算左上角方格到第列行每個方格的最短路徑值,並用該值更新當前方格儲存值。
        for i in range(1, m):
            grid[i][0] += grid[i-1][0]
            
        # 從第二行第二列開始迴圈矩陣,根據比較第i行第j-1列方格最短路徑值與第i-1行第j列方格的最短路徑值哪一個更小,小的數值加上當前方格內數值即為從左上角方格到當前方格的最短路徑值,並用該值更新當前方格儲存值。
        for i in range(1, m):
            for j in range(1, n):
                # 溫馨提示:python裡並沒有條件運算子“ 判斷條件 ? 判斷條件正確值 : 判斷條件錯誤值”,但是有類似的操作,如下例所示。
                grid[i][j] += (grid[i][j-1] if grid[i][j-1] < grid[i-1][j] else grid[i-1][j])    
                
        return grid[m-1][n-1]

其他

Runtime: 49ms

測試用例:61 / 61

想法不夠優化,歡迎大家留言交流~