1. 程式人生 > 其它 >LeetCode-064-最小路徑和

LeetCode-064-最小路徑和

技術標籤:演算法leetcode動態規劃java

給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例 1:

image.png

輸入:grid = [[1,3,1],[1,5,1],[4,2,1]]
輸出:7
解釋:因為路徑 1→3→1→1→1 的總和最小

示例 2:

輸入:grid = [[1,2,3],[4,5,6]]
輸出:12

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/minimum-path-sum

解題思路

在矩陣上修改

  1. 最左上角的位置, 不用修改
  2. 第一行的位置只能從該位置的左邊往右走, grid[i][j] += grid[i][j - 1]
  3. 第一列的位置只能從該位置的上邊往下走, grid[i][j] += grid[i - 1][j]
  4. 剩下的位置, 將選擇從該位置的左邊或上邊中路徑權值小的 grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1])

返回最後一個位置grid[m - 1][n - 1]

程式碼

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int
n = grid[0].length; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (i == 0 && j == 0) { continue; } else if (i == 0) { grid[i][j] += grid[i][j - 1]; } else if (j == 0) {
grid[i][j] += grid[i - 1][j]; } else { grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]); } } } return grid[m - 1][n - 1]; } }