LeetCode Hot100(65/100)——64. 最小路径和

前端JavaScript力扣HOT100刷题【51-100】 注:纯手打,如有错误欢迎评论区交流!编写此文是为了更好地学习前端知识,如果损害了有关人的利益,请联系删除!本文章将不定时更新,敬请期待!!!!! 阅读详情

题目链接

LeetCode 64. 最小路径和

题目说明

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

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

示例 1:

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

示例 2:

输入:grid = [[1,2,3],[4,5,6]]
输出:12

约束条件:

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

问题分析

这是一道经典的动态规划问题。我们需要从起点 (0,0) 走到终点 (m-1, n-1),每次只能向右或向下移动,目标是找到路径和最小的路径。

问题分析

路径限制

目标函数

解法思路

只能向右移动

只能向下移动

最小化路径和

动态规划

空间优化

解法一:二维动态规划

算法原理

使用二维数组 dp[i][j] 表示从起点 (0,0) 到达位置 (i,j) 的最小路径和。

状态转移方程:

  • 当 i = 0, j = 0 时:dp[0][0] = grid[0][0]
  • 当 i = 0 时(第一行):dp[0][j] = dp[0][j-1] + grid[0][j]
  • 当 j = 0 时(第一列):dp[i][0] = dp[i-1][0] + grid[i][0]
  • 其他情况:dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + grid[i][j]

思路流程图

i,j

完成

开始

初始化dp数组

dp_0_0 = grid_0_0

填充第一行

填充第一列

遍历剩余单元格

dp_i_j = min
dp_i-1_j, dp_i_j-1
+ grid_i_j

返回dp_m-1_n-1

结束

Java代码实现

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 j = 1; j < n; j++) {
            dp[0][j] = dp[0][j - 1] + grid[0][j];
        }
        
        // 初始化第一列
        for (int i = 1; i < m; i++) {
            dp[i][0] = dp[i - 1][0] + grid[i][0];
        }
        
        // 填充其余位置
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
            }
        }
        
        return dp[m - 1][n - 1];
    }
}

复杂度分析

  • 时间复杂度:O(m × n),需要遍历整个网格一次
  • 空间复杂度:O(m × n),需要额外的二维数组存储dp值

解法二:一维动态规划(空间优化)

算法原理

观察状态转移方程,我们发现计算 dp[i][j] 时只需要 dp[i-1][j](上方)和 dp[i][j-1](左方)的值。因此可以使用一维数组进行空间优化。

使用一维数组 dp[j] 表示当前行到达第 j 列的最小路径和。在更新过程中:

  • dp[j] 更新前存储的是上一行第 j 列的值(相当于 dp[i-1][j])
  • dp[j-1] 存储的是当前行第 j-1 列的值(相当于 dp[i][j-1])

优化思路图

二维数组 m×n

观察依赖关系

只依赖上方和左方

使用一维数组

空间复杂度 O_n_

Java代码实现

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        
        // 只需要一维数组
        int[] dp = new int[n];
        
        // 初始化第一行
        dp[0] = grid[0][0];
        for (int j = 1; j < n; j++) {
            dp[j] = dp[j - 1] + grid[0][j];
        }
        
        // 逐行更新
        for (int i = 1; i < m; i++) {
            // 更新当前行的第一列
            dp[0] = dp[0] + grid[i][0];
            
            // 更新当前行的其他列
            for (int j = 1; j < n; j++) {
                dp[j] = Math.min(dp[j], dp[j - 1]) + grid[i][j];
            }
        }
        
        return dp[n - 1];
    }
}

复杂度分析

  • 时间复杂度:O(m × n),仍需遍历整个网格
  • 空间复杂度:O(n),只需要长度为 n 的一维数组

解法三:原地修改(终极优化)

算法原理

如果允许修改原数组,可以直接在 grid 数组上进行动态规划,无需额外空间。

Java代码实现

class Solution {
    public int minPathSum(int[][] grid) {
        int m = grid.length;
        int n = grid[0].length;
        
        // 初始化第一行
        for (int j = 1; j < n; j++) {
            grid[0][j] += grid[0][j - 1];
        }
        
        // 初始化第一列
        for (int i = 1; i < m; i++) {
            grid[i][0] += grid[i - 1][0];
        }
        
        // 填充其余位置
        for (int i = 1; i < m; i++) {
            for (int j = 1; j < n; j++) {
                grid[i][j] += Math.min(grid[i - 1][j], grid[i][j - 1]);
            }
        }
        
        return grid[m - 1][n - 1];
    }
}

复杂度分析

  • 时间复杂度:O(m × n)
  • 空间复杂度:O(1),不需要额外空间

解法对比

解法对比

二维DP

时间: O_m×n_

空间: O_m×n_

易理解

一维DP

时间: O_m×n_

空间: O_n_

空间优化

原地修改

时间: O_m×n_

空间: O_1_

修改原数组

示例演示

以示例 1 为例:grid = [[1,3,1],[1,5,1],[4,2,1]]

二维DP过程

初始网格:          dp数组构建过程:
1  3  1           1  4  5
1  5  1    →      2  7  6
4  2  1           6  8  7

最小路径和 = 7
路径: 1→3→1→1→1

状态转移示例

(0,0)
值:1
路径和:1

(0,1)
值:3
路径和:4

(1,0)
值:1
路径和:2

(1,1)
值:5
路径和:7

(2,2)
值:1
路径和:7

总结

本题是动态规划的经典问题,核心在于找到状态转移方程。三种解法的时间复杂度相同,但空间复杂度逐步优化:

  1. 二维DP:最直观,适合初学者理解
  2. 一维DP:空间优化,实际应用推荐
  3. 原地修改:极致优化,但会修改原数组

在实际面试中,建议先说明二维DP思路,再提出空间优化方案,展现对算法的深入理解。

算法工程化:从LeetCode到生产环境的四层落地体系 算法工程化是将经典算法转化为高可用、可观测、受控资源约束的生产级服务的过程。其核心在于突破‘解题思维’局限,面向真实系统约束——如内存限制、并发竞争、IO延迟与SLA保障——重构算法的设计、实现与交付范式。关键技术价值体现在接口契约化(如带memoryBudget的SortRequest)、执行策略可插拔(KMP/RabinKarp动态切换)、资源显式声明(布隆过滤器内存预估)及全链路可观测性(Prometheus指标+业务指标关联分析)。典型应用场景覆盖实时风控、流式Top-K、路径规划与协同编辑等高负载 阅读详情

相关推荐

MoE模型激活率真相:2%参数使用背后的硬件与工程约束

稀疏化大模型(如MoE架构)是当前提升推理效率的关键路径,其核心原理在于通过动态路由机制仅激活部分专家参数,从而降低显存带宽压力而非单纯减少计算量。技术价值体现在HBM利用率提升、长上下文部署可行性增强及千卡集群通信开销可控性优化。典型应用场景包括高并发API服务、128K+长文档理解、金融/法律等专业领域推理系统。但‘2%每Token’并非固定指标,而是受专家数量、路由策略、硬件带宽(如H100 NVLink)、KV Cache管理等多重约束的实测结果。本文基于Qwen2-MoE、Mixtral等开源模型

技术百科 428

力扣hot100

【代码】力扣hot100。

qq_59768361的博客 1400

DeepSeek-V4架构总览:长上下文智能体基座的范式迁移

大语言模型正从‘文本生成器’迈向‘长上下文智能体基座’,其核心在于突破传统Transformer的上下文瓶颈与注意力机制限制。随着1M级上下文成为现实,模型需重构KV缓存管理、稀疏注意力调度、工具调用协议及推理强度控制等关键能力。DeepSeek-V4通过DSA稀疏注意力、动态分层缓存、指令感知解码器(IAD)和Anthropic原生API范式,系统性解决长上下文下的显存爆炸、计算冗余与任务漂移问题。该架构不仅支撑Agentic Coding等高确定性场景,更推动开发者角色从prompt engineer升

weixin_33889245的博客 398

Hot 100总结【leetcode】

leetcode hot100总结

weixin_44911248的博客 6639

LeetCode 热题 100 回顾

力扣最受刷题发烧友欢迎的 100 道题 LeetCode 热题 100 : 题目回顾、解题思路、复杂度分析、代码实现、验证算法

曾经“等你生日那天”都遥远得像未来,如今却可欢愉的挥手说“下个十年见” 9万+

【信息科学与工程学】【数据科学】数据科学领域 第六篇 算法设计 07 堆、栈、表、矩阵、集合、队列、数组、字符串、树、图、动态规划、结构体、元组的算法01

当前段必须包含所有字符的最后出现位置。1. 字符串分割成最多片段2. 基因序列功能域划分3. 文本段落划分4. 音频声道分离5. 图像色彩分区6. 社交网络社群划分7. 蛋白质结构域8. 音乐乐章分段9. 代码模块划分10. 章节划分特征:一次扫描,贪心确定边界。

weixin_49199313的博客 1267

Leetcode hot100 补刷部分 Ⅲ

二分法、栈、堆、贪心算法、动态规划、多维动态规划、技巧

weixin_45051929的博客 1198

基于RK3588与FPGA的SDI视频处理系统:从MIPI CSI-2输入到DSI输出的全链路解析

本文深入解析了基于RK3588与FPGA的SDI视频处理系统全链路。系统利用FPGA作为高速接口转换与流管理核心,将SDI信号转换为MIPI CSI-2数据流送入RK3588进行智能图像处理与AI分析,处理结果再通过MIPI DSI回传,最终由FPGA控制编码为SDI输出,实现了专业视频接口与强大算力的高效协同。

s1t2u3的博客 666

LeetCode 热题 HOT 100 完整题解笔记&知识点分类 C++代码实现

1、知识点分布 2、完整代码

小哈里的博客 1万+

433MHz无线通信

基本概念 工作频率:433.92MHz 调制方式:ASK/OOK,FSK,GFSK 现有遥控与接收器方案中,多数使用ASK/OOK调试方式。ASK即“幅移键控”又称为“振幅键控”,也有称为“开关键控”(通断键控)的,所以又记作OOK(On-Off keyed)信号。ASK是一种相对简单的调制方式。幅移键控(ASK)相当于模拟信号中的调幅,不同的是与载频信号相乘的是二进制数码。幅移就是把频...

沧海孤叶的博客 5万+

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7169

力扣热题100(附刷题表版)

不仅方便查看题目,并且,在完成题目后,,我放在了结尾,大家自取,直接复制粘贴到。2. 字母异位词分组(中等)3. 最长连续序列(中等)1. 两数之和 (简单)时做记录,整理了下面。

2301_79966297的博客 2232

基于Python的网贷平台数据爬虫实战:Scrapy+Selenium+反反爬策略

python复制下载# items.py本文详细介绍了如何使用Python构建一个完整的网贷平台数据爬虫系统,涵盖了从基础爬取到高级反反爬策略的全套解决方案。我们使用了Scrapy框架作为基础,结合Selenium处理动态内容,实现了多种反反爬策略,并探讨了分布式爬虫的实现方式。机器学习识别验证码基于深度学习的网页结构变化检测自动化行为模拟的更精细控制基于Kubernetes的弹性爬虫集群。

2201_76125261的博客 1560

力扣HOT100热题宝典--第4节

力扣HOT100热题宝典--第4节,动态规划

weixin_41171614的博客 820

【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码

1 简介 数字波束形成技术是天线波束形成原理与数字信号处理技术相结合的产物,其广泛应用于阵列信号处理领域.由于电磁工作环境的恶化和大量射频干扰的存在,在极低的信干噪比(SINR)条件下进行目标检测和信息提取十分困难.对于阵列系统,往往采用自适应数字波束形成(ADBF)技术,来抑制强干扰和方向性干扰对有用信号的影响.介绍了数字波束形成器的基本原理及其DSP的实现结构.​ 2 完整代码 clc;clear all;close all;%%%%%%%%%%%%%%%%%一维DBF%%%%%%%%%%%%%

qq_59747472的博客 7265

由于找不到mfc110u.dll,无法继续执行代码,重新安装程序可能会解决此问题的 解决方案

本文主要介绍了由于找不到mfc110.dll,无法继续执行代码的解决方案,希望能对使用Windows的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

LeetCode 热题 100

示例 1:输入:nums = [-1,0,1,2,-1,-4] 输出:[[-1,-1,2],[-1,0,1]] 解释: nums[0] + nums[1] + nums[2] = (-1) + 0 + 1 = 0。示例 1:输入: nums = [1,2,3,4,5,6,7], k = 3 输出: [5,6,7,1,2,3,4] 解释: 向右轮转 1 步: [7,1,2,3,4,5,6] 向右轮转 2 步: [6,7,1,2,3,4,5] 向右轮转 3 步: [5,6,7,1,2,3,4]

fhfghfdhg的博客 1005

fasterlio原理及代码框架梳理

Faster-LIO 的优势是在保持同等高精度的前提下,显著提升计算效率,以支持更极端的应用场景(如高速无人机)和更廉价的硬件平台。可以把 Faster-LIO 理解为用一把更快的“空间哈希筛子”(iVox)替换了原来精细的“动态平衡树”(ikd-Tree),从而在精度损失极小的情况下,实现了效率的显著提升。:只在实际有地图点的空间区域动态创建和保留体素单元,形成一个稀疏的体素地图。是关键:将去畸变点云中的每个点,在 iVox 维护的局部地图中搜索近邻(如5个最近点),构建点到面的距离残差。

Studying…… 246

leetcode-HOT目录

66. 在排序数组中查找元素的第一个和最后一个位置。68. 寻找旋转排序数组中的最小值。29. 删除链表的倒数第N个节点。44. 二叉搜索树中第K小的元素。69. 寻找两个正序数组的中位数。75. 数组中的第K个最大元素。8. 无重复字符串的最长子串。16. 除自身以外数组的乘积。30. 两两交换链表中的节点。32. 复制带随机指针的链表。49. 二叉树的最近公共祖先。50. 二叉树中的最大路径和。57. 电话号码的字母组合。78. 买卖股票的最佳时机。17. 缺失的第一个正数。21. 搜索二维矩阵II。

JXH_123的专栏 865

嵌入式硬件中AI硬件设计方法与技巧

嘉立创EDA推出AI助手Kimi插件,为PCB设计提供智能支持。该插件具备四大核心功能:AI问答助手可解答各类电路设计问题;元件查询功能直接展示参数和应用场景;智能分析网表可检测潜在问题;电路图识别能解析图纸结构并提供改进建议。用户需通过扩展插件安装,并配置Kimi API密钥后使用。该工具旨在提升工程师的设计效率,减少查阅资料时间,特别适合项目交接和设计自查场景。

嵌入式技术开发 1866

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

ms-hot目录

131. 长度为n的开心字符串中字典序第k小的字符串。126. 每个元音包含偶数次的最长子字符串。159. 得到连续K个1的最小相邻交换次数。190. 应用操作后不同二进制字符串的数量。38. 填充每个节点的下一个右侧结点指针。205. 使数组中所有元素相等的最小开销。208. 统计X和Y频数相等的子矩阵数量。138. 删除链表M个节点后的N个节点。167. 使数组元素相等的减少操作次数。177. 分享K个糖果后独特口味的数量。填充每个节点的下一个右侧结点指针II。104. 将数组分成和相等的三个部分。

JXH_123的专栏 567

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

算法刷题专栏介绍

剑指offer,力扣热题,牛客top100

weixin_41171614的博客 1056

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

工业级算法思维:从复杂度分析到真实场景选型

算法是程序员与计算机达成高效协作的底层契约,其本质不是数学推导或代码实现,而是对计算资源(时间、空间、能耗、可维护性)的系统性权衡。理解Big O不仅是掌握渐进复杂度,更是建立资源预算意识;选择红黑树还是跳表,取决于QPS、内存限制与调试成本的四维权衡;哈希去重、冷启动推荐、OTA分块升级等高频工程问题,背后都是数据结构与算法策略的精准匹配。本文聚焦真实工业场景,融合XXH3哈希、Fibonacci堆、Bloom Filter分层过滤等关键技术实践,揭示如何将算法从应试知识转化为可落地、可验证、可演进的工程

weixin_34166472的博客 752

Python数据结构选型实战:时间、空间与线程安全的动态权衡

Python数据结构并非简单的语法工具,而是底层C实现、内存模型与运行时机制共同作用的结果。理解list的动态扩容策略、dict的开放寻址哈希表、deque的块状内存管理,是规避O(n)退化、内存爆炸和GC压力的前提。在真实系统中,选型本质是在时间复杂度、内存占用、可读性与线程安全性之间做场景化权衡——例如高并发订单状态同步需避开list.remove()的线性查找,传感器时序数据应优先采用array.array降低80%内存开销。本文基于支付网关、实时风控等高并发生产案例,结合perf火焰图、timeit

aoanping0730的博客 314

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等)

LeetCode 面试经典 150_多维动态规划_交错字符串(97_C++_中等) 题目描述: 给定三个字符串 s1、s2、s3,请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下,其中每个字符串都会被分割成若干 非空 子字符串: - s = s1 + s2 + ... + sn - t = t1 + t2 + ... + tm - |n - m| <= 1 - 交错 是 s1 + t

huayimenghan的博客 205

LeetCode 每日一题 2026/11/2-2026/11/8

记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步

AlphaTao的博客 175
上一篇: LeetCode Hot100(64/100)——70. 爬楼梯
下一篇: Prompt Engineer 使用、设计、优化
TracyCoder123
博客等级 码龄8年 1万+粉丝 226原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TracyCoder123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值