最小路径和(leetcode 64)
一:解题思路
这是一道经典的动态规划的题目。
方法一:定义初始转态和转态转移方程。
d[0][0]=a[0][0];对于一行:d[0][j]=d[0][j-1]+a[0][j]; 对于第一列:d[i][0]=d[i-1][0]+a[i][0];
除了第一行和第一列之外的其他元素:d[i][j]=min(d[i-1][j],d[i][j-1])+a[i][j];
Time:O(m*n),Space:O(m*n)
方法二:
Time:O(m*n),Space:O(n)
二:完整代码示例 (C++版和Java版)
方法一C++:
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> d(m, vector<int>(n)); d[0][0] = grid[0][0]; for (int i = 1; i < m; i++) d[i][0] = d[i - 1][0] + grid[i][0]; for (int j = 1; j < n; j++) d[0][j] = d[0][j - 1] + grid[0][j]; for (int i = 1; i < m; i++) { for (int j = 1; j < n; j++) d[i][j] = min(d[i-1][j],d[i][j-1]) + grid[i][j]; } return d[m-1][n-1]; } };
方法二C++:
class Solution { public: int minPathSum(vector<vector<int>>& grid) { int m = grid.size(), n = grid[0].size(); vector<int> d(n,-1); d[0] = grid[0][0]; for (int j = 1; j < n; j++) d[j] = d[j - 1] + grid[0][j]; for (int i = 1; i < m; i++) { d[0] += grid[i][0]; for (int j = 1; j < n; j++) d[j] = min(d[j], d[j - 1]) + grid[i][j]; } return d[n-1]; } };
方法一Java:
class Solution { public int minPathSum(int[][] grid) { int m=grid.length,n=grid[0].length; int[][] d=new int[m][n]; d[0][0]=grid[0][0]; for(int i=1;i<m;i++) d[i][0]=d[i-1][0]+grid[i][0]; for(int j=1;j<n;j++) d[0][j]=d[0][j-1]+grid[0][j]; for(int i=1;i<m;i++) { for(int j=1;j<n;j++) { d[i][j]=Math.min(d[i-1][j],d[i][j-1])+grid[i][j]; } } return d[m-1][n-1]; } }
方法二Java:
class Solution { public int minPathSum(int[][] grid) { int m=grid.length,n=grid[0].length; int[] d=new int[n]; d[0]=grid[0][0]; for(int j=1;j<n;j++) d[j]=d[j-1]+grid[0][j]; for(int i=1;i<m;i++) { d[0]+=grid[i][0]; for(int j=1;j<n;j++) d[j]=Math.min(d[j],d[j-1])+grid[i][j]; } return d[n-1]; } }
方法一Python:
首先,需要知道一个知识点,在Python中,创建一个二维数组,是需要这样的写法:d= [[0] * cols for i in range(rows)],然后就可以按照C++中数组访问的方式去访问数组。例如,改变数组d的第一行,第一列的元素为1。d[0][0]=1。
class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m=len(grid) n=len(grid[0]) d=[[0]*n for i in range(m)] d[0][0]=grid[0][0] for j in range(1,n): d[0][j]=d[0][j-1]+grid[0][j] for i in range(1,m): d[i][0]=d[i-1][0]+grid[i][0] for i in range(1,m): for j in range(1,n): d[i][j]=min(d[i-1][j],d[i][j-1])+grid[i][j] return d[m-1][n-1]
方法二Python:
class Solution: def minPathSum(self, grid: List[List[int]]) -> int: m=len(grid) n=len(grid[0]) d=[0]*n d[0]=grid[0][0] for j in range(1,n): d[j]=d[j-1]+grid[0][j] for i in range(1,m): d[0]+=grid[i][0] for j in range(1,n): d[j]=min(d[j],d[j-1])+grid[i][j] return d[n-1]

浙公网安备 33010602011771号