题目:64. 最小路径和
方法一:深度优先搜索dfs+记忆化。时间复杂度为0(nm)。
C++版本:
class Solution {
public:
vector<vector<int>> v;
int dfs(int n,int m,vector<vector<int>>& grid){
if(n<0||m<0) return INT_MAX;
if(n==0&&m==0) return grid[n][m];
if(v[n][m]!=-1) return v[n][m];
return v[n][m]=min(dfs(n-1,m,grid),dfs(n,m-1,grid))+grid[n][m];
}
int minPathSum(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
v=vector<vector<int>>(n,vector<int>(m,-1));
return dfs(n-1,m-1,grid);
}
};
JAVA版本:
class Solution {
int[][] sta;
int dfs(int n,int m,int[][] grid){
if(n<0||m<0) return Integer.MAX_VALUE;
if(n==0&&m==0) return grid[n][m];
if(sta[n][m]!=-1) return sta[n][m];
return sta[n][m]=Math.min(dfs(n-1,m,grid),dfs(n,m-1,grid))+grid[n][m];
}
public int minPathSum(int[][] grid) {
int n=grid.length,m=grid[0].length;
sta=new int[n][m];
for(int[] x:sta){
Arrays.fill(x,-1);
}
return dfs(n-1,m-1,grid);
}
}
方法二:动态规划dp,递推。时间复杂度0(nm)。
C++版本:
class Solution {
public:
int minPathSum(vector<vector<int>>& grid) {
int n=grid.size(),m=grid[0].size();
vector<vector<int>> v=vector<vector<int>>(n+1,vector<int>(m+1,INT_MAX));
v[0][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
v[i][j]=min(v[i-1][j],v[i][j-1])+grid[i-1][j-1];
}
}
return v[n][m];
}
};
JAVA版本:
class Solution {
public int minPathSum(int[][] grid) {
int n=grid.length,m=grid[0].length;
int[][] v=new int[n+1][m+1];
for(int[] x:v){
Arrays.fill(x,Integer.MAX_VALUE);
}
v[0][1]=0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
v[i][j]=Math.min(v[i-1][j],v[i][j-1])+grid[i-1][j-1];
}
}
return v[n][m];
}
}