leetcode-64

141 阅读1分钟

题目描述:具体描述见原题。简单来说就是找到最小路径和。

解题思路:该题也是基于No.62,在此基础上对迷宫每个格子赋予数值,因此就存在一个最小路径和的说法。还是套用dp思路,先构造边界最小路径和,使用边界路径值求起始点到每个格子最小路径和。起始点到gird[i][j]最小路径和就是求res[i-1][j]和res[i][j-1]两者较小值,然后加上grid[i][j]值。res[i][j]值代表起始点到点(i,j)最小路径和。具体过程见代码。

具体代码:

func minPathSum(grid [][]int) int {
    if len(grid) == 0 || len(grid[0]) == 0 {
		return 0
	}
	m, n := len(grid), len(grid[0])
	res := make([][]int, m)
    	for i := 0; i < m; i++ {  // 构造二维数组
		res[i] = make([]int, n)
	}
	res[0][0] = grid[0][0] // 给初始点赋值
	for i := 1; i< m; i++ { // 构造边界值,由于题目中前进方向固定,所以边界最小路径和就是简单依次加和
		res[i][0] = grid[i][0] + res[i-1][0]
	}
	for i := 1; i< n; i++ { // 构造边界值
		res[0][i] = grid[0][i] + res[0][i-1]
	}
	for i := 1; i < m; i++ {
		for j := 1; j < n; j++ {
			res[i][j] = grid[i][j] + int(math.Min(float64(res[i-1][j]), float64(res[i][j-1])))  // 套用dp核心公式。
		}
	}
	return res[m-1][n-1]
}

补充说明:该题也是动态规划基本应用之一,同样可以结合障碍点概念。套用dp核心公式那一步其实是res[i][j] = grid[i][j] + min(res[i-1][j], res[i][j-1]),具体代码中使用了go的math包,添加了一些转型。如果不使用math包,可以自己实现min函数。