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

leetcode hot100【LeetCode 64.最小路径和】java实现

LeetCode 64.最小路径和

题目描述

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

每次只能向下或向右移动一步。

示例 1:

输入: grid = [
  [1, 3, 1],
  [1, 5, 1],
  [4, 2, 1]
]
输出: 7
解释: 因为路径 1→3→1→1→1 的总和最小。

说明:

  • m == grid.length
  • n == grid[i].length
  • 1 <= m, n <= 200
  • 0 <= grid[i][j] <= 100

Java 实现

public class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;

        // dp 数组用于存储最小路径和
        int[][] dp = new int[m][n];

        // 初始化第一行
        dp[0][0] = grid[0][0];
        for (int i = 1; i < m; i++) {
            dp[i][0] = dp[i-1][0] + grid[i][0];
        }
        
        // 初始化第一列
        for (int j = 1; j < n; j++) {
            dp[0][j] = dp[0][j-1] + grid[0][j];
        }

        // 填充 dp 数组
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = grid[i][j] + Math.min(dp[i-1][j], dp[i][j-1]);
            }
        }

        // 返回右下角的最小路径和
        return dp[m-1][n-1];
    }
}

解题思路

该问题可以使用动态规划(Dynamic Programming, DP)来解决。基本思路是从网格的起点 (0, 0)
出发,计算到达每个位置的最小路径和。我们可以根据到达当前格子的最小路径是从上方还是从左方到达的来更新当前格子的路径和。

  1. 定义状态:

    • dp[i][j] 为从起点 (0, 0) 到达位置 (i, j) 的最小路径和。
  2. 状态转移:

    • 对于每个格子 (i, j),可以通过上方 (i-1, j) 或左方 (i, j-1) 来到达,路径的最小值为这两个位置路径和的最小值加上当前格子的值:
      [dp[i][j] = grid[i][j] + min(dp[i-1][j], dp[i][j-1])]
    • 边界条件:如果在第一行或者第一列,机器人只能从左侧或上侧到达,所以路径和应该累加。
  3. 边界条件:

    • 第一行和第一列的路径和是累加的,因为机器人只能从左方或上方到达:
      [dp[0][j] = dp[0][j-1] + grid[0][j]]
      [dp[i][0] = dp[i-1][0] + grid[i][0]]
  4. 求解: 最终结果为 dp[m-1][n-1],即到达右下角的最小路径和。

复杂度分析

  • 时间复杂度O(m * n),需要遍历整个 m x n 网格,计算每个位置的最小路径和。
  • 空间复杂度O(m * n),用于存储 dp 数组。

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

相关文章:

  • Python中的with语句
  • 正则表达式语法详解(python)
  • Oracle 19c PDB克隆后出现Warning: PDB altered with errors受限模式处理
  • 使用WebSocket技术实现Web应用中的实时数据更新
  • 丹摩征文活动|丹摩助力selenium实现大麦网抢票
  • 【Ubuntu24.04】使用服务器
  • MySQL一些使用操作-持续更新
  • 前端,location.reload刷新页面
  • Go语言24小时极速学习教程(一)基础语法
  • 【网络安全】Cookie SameSite属性
  • 贪吃蛇小游戏设计
  • java八股-jvm入门-程序计数器,堆,元空间,虚拟机栈,本地方法栈,类加载器,双亲委派,类加载执行过程
  • 121、SQL Server取开始时间、截止时间
  • 阿里云引领智算集群网络架构的新一轮变革
  • 上交大与上海人工智能研究所联合推出医学多语言模型,模型数据代码开源
  • C++中的单例模式(Singleton)全面讲解与实际案例
  • 室内定位论文精华-无人机与机器人在地下与室内环境中的自主导航与定位新技术
  • 数据结构------队列(Java语言描述)
  • C# 反射与动态编程
  • 本草智链:中药实验管理的区块链应用
  • web前端开发--网页
  • C++(Qt)软件调试---内存泄漏分析工具MTuner (25)
  • 199. 二叉树的右视图【 力扣(LeetCode) 】
  • 深挖C++赋值
  • 在Ubuntu22.04上源码构建ROS noetic环境
  • Harmony错题本--@Preview标注上依然无法预览