64.M 最小路径和

Problem: 64. 最小路径和arrow-up-right

思路

动态规划。

dp[i][j]表示到达位置i,j的最小路径和,那么:

  • dp[0][0] = grid[0][0]

  • 对于第一行,有dp[i][j] = dp[i][j-1] + grid[i][j]

  • 对于第一列,有dp[i][j] = dp[i-1][j] + grid[i][j]

  • 对于其他行列:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

Code

func minPathSum(grid [][]int) int {
	if len(grid) == 0 || len(grid[0]) == 0 {
		return 0
	}

	m, n := len(grid), len(grid[0])
	dp := make([][]int, m)
	for i := range dp {
		dp[i] = make([]int, n)
	}

	for i := 0; i < m; i++ {
		for j := 0; j < n; j++ {
			if i == 0 && j == 0 {
				dp[i][j] = grid[i][j]
			} else if i == 0 {
				dp[i][j] = dp[i][j-1] + grid[i][j]
			} else if j == 0 {
				dp[i][j] = dp[i-1][j] + grid[i][j]
			} else {
				dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]
			}
		}
	}

	return dp[m-1][n-1]
}

func min(a, b int) int {
	if a < b {
		return a
	}

	return b
}

Last updated