当前位置: 首页 > article >正文

【Leetcode 热题 100】64. 最小路径和

问题背景

给定一个包含非负整数的 m × n m \times n m×n 网格 g r i d grid grid,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。
说明:每次只能向下或者向右移动一步。

数据约束

  • m = g r i d . l e n g t h m = grid.length m=grid.length
  • n = g r i d [ i ] . l e n g t h n = grid[i].length n=grid[i].length
  • 1 ≤ m , n ≤ 200 1 \le m, n \le 200 1m,n200
  • 0 ≤ g r i d [ i ] [ j ] ≤ 200 0 \le grid[i][j] \le 200 0grid[i][j]200

解题过程

比较标准的动态规划题,可以根据回溯的实现翻译成递推,进行空间优化。
写递推的时候要注意数组下标不能为 − 1 -1 1,要偏移来修正。

具体实现

递归

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] memo = new int[m][n];
        for (int[] row : memo) {
            Arrays.fill(row, -1);
        }
        return dfs(m - 1, n - 1, grid, memo);
    }

    private int dfs(int i, int j, int[][] grid, int[][] memo) {
        if (i < 0 || j < 0) {
            return Integer.MAX_VALUE;
        }
        if (i == 0 && j == 0) {
            return grid[i][j];
        }
        if(memo[i][j] != -1) {
            return memo[i][j];
        }
        return memo[i][j] = Math.min(dfs(i, j - 1, grid, memo), dfs(i - 1, j, grid, memo)) + grid[i][j];
    }
}

递推

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        int[][] dp = new int[m + 1][n + 1];
        Arrays.fill(dp[0], Integer.MAX_VALUE);
        dp[0][1] = 0;
        for (int i = 0; i < m; i++) {
            dp[i + 1][0] = Integer.MAX_VALUE;
            for (int j = 0; j < n; j++) {
                dp[i + 1][j + 1] = Math.min(dp[i + 1][j], dp[i][j + 1]) + grid[i][j];
            }
        }
        return dp[m][n];
    }
}

空间优化

class Solution {
    public int minPathSum(int[][] grid) {
        int n = grid[0].length;
        int[] dp = new int[n + 1];
        Arrays.fill(dp, Integer.MAX_VALUE);
        dp[1] = 0;
        for (int[] row : grid) {
            for (int j = 0; j < n; j++) {
                dp[j + 1] = Math.min(dp[j], dp[j + 1]) + row[j];
            }
        }
        return dp[n];
    }
}

http://www.kler.cn/a/528901.html

相关文章:

  • 图书管理系统 Axios 源码__编辑图书
  • 增删改查(CRUD)操作
  • 新手从零开始使用飞牛fnOS搭建家庭数据管理中心体验NAS系统
  • pytorch基于 Transformer 预训练模型的方法实现词嵌入(tiansz/bert-base-chinese)
  • 【Linux】22.进程间通信(1)
  • webrtc编译需要常用环境变量以及相关名词解释
  • Leetcode::81. 搜索旋转排序数组 II
  • DRM系列三:drm core模块入口
  • 40. SPI实验
  • 《解锁AI黑科技:数据分类聚类与可视化》
  • 1979-2021年 全国各省、地级市、区县空气流通系数
  • Google Chrome-便携增强版[解压即用]
  • DeepSeek模型与OpenAI模型原理和技术架构的异同分析
  • 深度学习 Pytorch 神经网络的学习
  • npm 和 pip 安装中常见问题总结
  • xss-labs靶场
  • 基于 STM32 的智能电动车防盗与管理系统
  • 基于YOLO11的肺结节检测系统
  • 【博弈论 学习】Chapter1. 策略式博弈与Nash均衡
  • sqli-labs靶场通关