算法小知识-----04.08-----最小路径和

139 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

今天的每日一题也是格外的令人开朗(绝对不是因为简单)

最小路径和

该题出自力扣的64题 —— 最小路径和【中等题】

审题

给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

说明: 每次只能向下或者向右移动一步。

image.png

  • 这道题很显而易见就是动态规划的实现,与前天的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];
    }
}

image.png