LeetCode-热题100:64. 最小路径和

news2024/11/26 18:29:39

题目描述

给定一个包含非负整数的 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

代码及注释

func minPathSum(grid [][]int) int {
    // 遍历二维网格
    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            // 如果是起点,跳过
            if i == 0 && j == 0 {
                continue
            } 
            // 对于第一行,只能从左边的格子过来
            if i == 0 {
                grid[i][j] += grid[i][j - 1]
            } else if j == 0 {
                // 对于第一列,只能从上方的格子过来
                grid[i][j] += grid[i - 1][j]
            } else {
                // 对于其他格子,路径和为上方格子和左方格子中较小的路径和加上当前格子的值
                grid[i][j] += min(grid[i - 1][j], grid[i][j - 1])
            }
        }
    }
    // 返回右下角格子的最小路径和
    return grid[len(grid) - 1][len(grid[0]) - 1]
}

// 辅助函数,返回两个数中的较小值
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

代码解释

  1. 遍历二维网格:

    for i := 0; i < len(grid); i++ {
        for j := 0; j < len(grid[0]); j++ {
            // 如果是起点,跳过
            if i == 0 && j == 0 {
                continue
            } 
            // 对于第一行,只能从左边的格子过来
            if i == 0 {
                grid[i][j] += grid[i][j - 1]
            } else if j == 0 {
                // 对于第一列,只能从上方的格子过来
                grid[i][j] += grid[i - 1][j]
            } else {
                // 对于其他格子,路径和为上方格子和左方格子中较小的路径和加上当前格子的值
                grid[i][j] += min(grid[i - 1][j], grid[i][j - 1])
            }
        }
    }
    
    • 使用两层循环遍历二维网格,计算每个格子的最小路径和。
    • 对于第一行和第一列的格子,只能从一个方向过来,所以只需加上一个方向的值。
    • 对于其他格子,最小路径和为上方格子和左方格子中较小的路径和加上当前格子的值。
  2. 返回结果:

    return grid[len(grid) - 1][len(grid[0]) - 1]
    
    • 返回右下角格子的最小路径和,即为从左上角到右下角的最小路径和。
  3. 辅助函数:

    func min(a, b int) int {
        if a < b {
            return a
        }
        return b
    }
    
    • 辅助函数 min 用于返回两个数中的较小值。

这个动态规划的解法时间复杂度为 O(m × n),空间复杂度为 O(1),因为我们直接修改了输入的二维网格。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1587601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二叉树:小红的完全二叉树构造

题目描述 小红想构造一个总共 n 个节点完全二叉树&#xff0c;该二叉树满足以下两个性质&#xff1a; 1. 所有节点的权值值为 1 ~ n 的一个排列。 2. 除了根节点以外&#xff0c;每个节点的权值和它父亲的权值的乘积为偶数。 请你帮小红构造出这个二叉树&#xff0c;并按层序遍…

Handler——小白能懂的原理,老鸟需要的面经

1.机制学习 1.1Handler定义 发送并处理 与线程的消息队列关联的Message和Runnable 1.2基本用法 1、Message.obtain() 从消息池取得Message 2、Handler().sendMessage(msg) 发送消息 3、Handler().post 将Runnable包装成Message发送 以下提供一个结构代码 import android.os.H…

嵌入式linux系统链接腾讯云的方法

各位开发者大家好,今天主要给大家分享一个,如何使用linux系统链接腾讯云的方法,因为微信小程序越来越普遍,链接腾讯云也是日常必须掌握的一个技能。 第一:【实验目的】 1、linux 系统连接腾讯云的方法 第二:【实验原理】 涉及到原理图添加原理图 2、linux开发板 …

AI 助力问题驱动式学习

文章概括&#xff1a; AI 已经带来学习方式的改变&#xff0c;降低了我们学习知识的难度&#xff0c;加快了我们解决问题的速度。 本文介绍如何通过 AI 工具&#xff0c;通过直接对大模型、对 Agent、对文档、对知识库提问的方式&#xff0c;快速学习知识快速解决问题等。 本…

Vue3学习03 pinia

Vue3学习 pinia pinia一个简单效果搭建 pinia 环境存储读取数据示例 修改数据 (三种方式)storeToRefsgetters$subscribestore组合式写法 pinia 在vue2中使用vuex&#xff0c;在vue3中使用pinia。 集中式状态管理&#xff0c;&#xff08;状态数据&#xff09;。多个组件共享数…

vue简单使用二(循环)

目录 属性绑定 if判断&#xff1a; for循环&#xff1a; 属性绑定 代码的形式来说明 三元表达式的写法&#xff1a; if判断&#xff1a; for循环&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"…

基于web的个人网站的设计与实现(内附设计LW + PPT+ 源码下载)

基于web的个人网站的设计与实现&#xff08;内附设计LW PPT 源码下载&#xff09; 摘 要 随着社会及个人社交应用平台的飞速发展&#xff0c;人们的沟通成本逐渐降低&#xff0c;互联网信息的普及也进一步提升了人们对于信息的需求度&#xff0c;通过建立个人网站的方式来…

【Linux】权限相关命令(九)

文章目录 ls命令&#xff08;常用&#xff09;su命令sudo命令chmod命令chown命令chgrp命令 当谈到Linux系统中的权限时&#xff0c;通常指的是文件和目录的权限。这些权限决定了谁可以对文件或目录进行何种类型的操作。在Linux中&#xff0c;权限通常被分为三个主要方面&#x…

Lesson2: 算法的时间复杂度和空间复杂度

【本节目标】 1. 算法效率 2. 时间复杂度 3. 空间复杂度 4. 常见时间复杂度以及复杂度 oj 练习 1.算法效率 1.1 如何衡量一个算法的好坏 如何衡量一个算法的好坏呢&#xff1f;比如对于以下斐波那契数列&#xff1a; long long Fib(int N) {if(N < 3)return 1;retu…

神经网络模型底层原理与实现8-BERT

首先介绍什么是自监督学习&#xff1a; 普通的有监督学习是每个x对应有个y&#xff0c;x训练得到y&#xff0c;将y与y作比较&#xff0c;而自监督是没有对应y&#xff0c;直接把一部分样本x作为训练目标x&#xff0c;训练得x后和x对比 bert中如何创造x&#xff1a;以文字处理为…

深度学习学习日记4.8(下午)

1.softmax 函数的得出的结果是样本被预测到每个类别的概率&#xff0c;所有类别的概率相加总和等于1。使用 softmax 进行数据归一化&#xff0c;将数字转换成概率。 2.熵&#xff0c;不确定性&#xff0c;越低越好 3.KL 散度交叉熵-信息熵 预测越准&#xff0c;交叉熵越小&am…

QT 信号与槽的简单使用

文章目录 1.通过Singloat and Slots Editor 添加信号与槽2. 通过拖动动态添加3.通过转到槽方式添加&#xff08;自动关联&#xff09;4. 自定义信号与槽&#xff08;connect)4.1 connect方式4.2 自定义信号 1.通过Singloat and Slots Editor 添加信号与槽 点添加&#xff0c;然…

pandas(day10)

一. 各各品类产品交易指数对比 获取文件名 files glob.glob("./*.xlsx")# 读取数据&#xff0c;并改列名&#xff0c;增加一列 品牌 dfs [] for f in files:t f[2:4]df pd.read_excel(f)df["品牌"] tif t "拜耳":df.rename(columns{"…

.NET MVC API Swagger 自动生成API文档入坑

开发环境 Win10 VS2022 .NET8.0 1.从NuGet添加Swagger 在解决方案资源管理器中右键单击项目>管理 NuGet 包 将包源设置为“nuget.org” 确保启用“包括预发行”选项 在搜索框中输入“Swashbuckle.AspNetCore” 从“浏览”选项卡中选择最新的“Swashbuckle.AspNetCore”包&a…

C++ | Leetcode C++题解之第21题合并两个有序链表

题解&#xff1a; 题解&#xff1a; class Solution { public:ListNode* mergeTwoLists(ListNode* l1, ListNode* l2) {ListNode* preHead new ListNode(-1);ListNode* prev preHead;while (l1 ! nullptr && l2 ! nullptr) {if (l1->val < l2->val) {prev-…

OJ刷题日记:1、双指针(1)

目录 1、283.移动零 2、1089.复写零 3、202.快乐数 1、283.移动零 题目&#xff1a; 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 …

PC-3000 Portable III、PC-3000 Express、PC-3000 UDMA 有哪些区别?

天津鸿萌科贸发展有限公司从事数据安全业务20余年&#xff0c;在数据恢复、数据取证、数据备份等领域有丰富的案例经验、前沿专业技术及良好的行业口碑。同时&#xff0c;公司面向取证机构及数据恢复公司&#xff0c;提供数据恢复实验室建设方案&#xff0c;包含数据恢复硬件设…

EEPROM读写案例(以AT24C02为例)

本篇文章主要是在学习单片机串行接口时的学习经历&#xff0c;主要侧重于驱动程序的讲解。下文将通过ESP32S3、STM32两款MCU进行编写驱动案例。 1、AT24C02简要说明 AT24C02是美国微芯科技公司生产的电擦写式只读存储器系列中的一款&#xff0c;其容量为2K位&#xff08;即256字…

ios包上架系列 四、虚拟机涉及网站

一、网站相关 苹果开发者平台 https://developer.apple.com/ 谷歌邮箱 https://mail.google.com/mail/u/0/#inbox 微云在线或者安装QQ https://www.weiyun.com/disk 下载下的为zip文件&#xff0c;需要复制里面的内容出来使用 二、环境配置 1、ios-upload 配置&#x…

LeetCode 最长重复子串的更换问题

LeetCode 最长重复子串的更换问题 在处理字符串问题时&#xff0c;我们经常会遇到一些具有挑战性的问题&#xff0c;比如今天的这个问题&#xff1a;给定一个字符串 s 和一个整数 k&#xff0c;我们的任务是找到可以通过最多更换 k 个字符来形成的最长重复子串的长度。 我的解…