一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
今天的每日一题也是格外的令人开朗(绝对不是因为简单)
最小路径和
该题出自力扣的64题 —— 最小路径和【中等题】
审题
给定一个包含非负整数的
m x n网格grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明: 每次只能向下或者向右移动一步。
- 这道题很显而易见就是动态规划的实现,与前天的62题不同路径是类似的做法,核心思想没有变,变得是业务的规则
- 该题的题意就是给出一个M × N的矩阵,找出从左上角到右下角的最小总和(每个格都会有一个数,需要相加)
- 核心的思想就是动态规划,每一个格子都是从上方或者左方过来的,因为题意提到了只能向下或者向右走
- 稍微修改的业务就是,每次的总和 = Math.min(上方的总和 ,左方的总和) + 当前格子
- 最终返回右下角的二维数组即可
- 需要注意的是边界值,也就是矩阵的四周,例如说当顶部的时候,i = 0,需要考虑最小总和 = 左边的总和 + 当前格子数
- 时间复杂度为O(mn),因为需要遍历整个二维矩阵
- 空间复杂度也为O(mn),因为需要一个全新的二维数组去计算当前格子的最小总和
编码
class Solution {
public int minPathSum(int[][] grid) {
int m = grid.length;
int n = grid[0].length;
int[][] a = new int[m][n];
for (int i = 0;i<m;i++){
for (int j = 0;j<n;j++){
if (i ==0 && j ==0){
a[i][j] = grid[i][j];
} else if (i == 0){
a[i][j] = a[i][j-1]+grid[i][j];
}else if (j == 0){
a[i][j] = a[i-1][j]+grid[i][j];
}else {
a[i][j] = Math.min(a[i-1][j],a[i][j-1]) + grid[i][j];
}
}
}
return a[m-1][n-1];
}
}