题目描述
第一次做法(类似于不同路径题目)
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
if(m<1){
return 0;
}
int n = grid[0].length;
int[][]sums = new int[m][n];
for(int i=0;i<n;i++){//初始化边界
if(i==0)
sums[0][i]= grid[0][i];
else
sums[0][i] = sums[0][i-1]+grid[0][i];
}
for(int i=0;i<m;i++){//初始化边界
if(i==0)
sums[i][0] = grid[i][0];
else
sums[i][0] = sums[i-1][0]+grid[i][0];
}
for(int i=1;i<m;i++){
for(int j=1;j<n;j++){
sums[i][j] = Math.min(sums[i-1][j],sums[i][j-1])+grid[i][j];
}
}
return sums[m-1][n-1];
}
}
时间复杂度:O(nm)
空间复杂度:O(nm)
直接在原数组上进行数值的运算:
//参考博主的文章
class Solution {
public int minPathSum(int[][] grid) {
for(int i = 0; i < grid.length; i++) {
for(int j = 0; j < grid[0].length; j++) {
if(i == 0 && j == 0) continue;
else if(i == 0) grid[i][j] = grid[i][j - 1] + grid[i][j];
else if(j == 0) grid[i][j] = grid[i - 1][j] + grid[i][j];
else grid[i][j] = Math.min(grid[i - 1][j], grid[i][j - 1]) + grid[i][j];
}
}
return grid[grid.length - 1][grid[0].length - 1];
}
}
明显时间复杂度一致。
空间复杂度:
O(1)
作者:jyd
链接:https://leetcode-cn.com/problems/minimum-path-sum/solution/zui-xiao-lu-jing-he-dong-tai-gui-hua-gui-fan-liu-c/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
滚动数组优化空间复杂度
时间复杂度:O(mn)
空间复杂度:O(n)
class Solution {
public int minPathSum(int[][] grid) {
if(grid.length == 0){
return -1;
}
int[] cur = new int[grid[0].length];
for(int i = 0; i < grid.length; ++i){
for(int j = 0; j < cur.length; ++j){
if(i == 0 && j >= 1){
cur[j] =cur[j - 1] + grid[i][j];
}else if(i == 0 && j == 0){
cur[j] = grid[i][j];
}else if(i >= 1 && j == 0){
cur[j] =cur[j] + grid[i][j];
}else{
cur[j] = Math.min(cur[j - 1], cur[j]) + grid[i][j];
}
}
}
return cur[cur.length - 1];
}
}
作者:hua666666
链接:https://leetcode-cn.com/problems/minimum-path-sum/solution/dong-tai-gui-hua-kong-jian-fu-za-du-jiang-zhi-on-b/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。