【数据结构-二维前缀最小值】力扣3148. 矩阵中的最大得分

news2024/11/13 9:26:25

给你一个由 正整数 组成、大小为 m x n 的矩阵 grid。你可以从矩阵中的任一单元格移动到另一个位于正下方或正右侧的任意单元格(不必相邻)。从值为 c1 的单元格移动到值为 c2 的单元格的得分为 c2 - c1 。

你可以从 任一 单元格开始,并且必须至少移动一次。

返回你能得到的 最大 总得分。

示例 1:
在这里插入图片描述
输入:grid = [[9,5,7,3],[8,9,6,1],[6,7,14,3],[2,5,3,1]]

输出:9

解释:从单元格 (0, 1) 开始,并执行以下移动:

  • 从单元格 (0, 1) 移动到 (2, 1),得分为 7 - 5 = 2 。
  • 从单元格 (2, 1) 移动到 (2, 2),得分为 14 - 7 = 7 。
    总得分为 2 + 7 = 9 。

示例 2:
在这里插入图片描述
输入:grid = [[4,3,2],[3,2,1]]

输出:-1

解释:从单元格 (0, 0) 开始,执行一次移动:从 (0, 0) 到 (0, 1) 。得分为 3 - 4 = -1 。

在这里插入图片描述

动态规划+前缀最小值

class Solution {
public:
    int maxScore(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<vector<int>> f(m+1, vector<int>(n+1, INT_MAX));
        int ans = INT_MIN;
        for(int i = 0; i < m; i++){
            for(int j = 0; j < n; j++){
                int mn = min(f[i+1][j],f[i][j+1]);
                ans = max(ans, grid[i][j] - mn);
                f[i+1][j+1] = min(mn, grid[i][j]);
            }
        }
        return ans;
    }
};

时间复杂度:O(mn),其中 m 和 n 分别为 mat 的行数和列数。
空间复杂度:O(mn)。

这道题首先要化简问题,示例1中:
从单元格 (0, 1) 移动到 (2, 1),得分为 7 - 5 = 2 。
从单元格 (2, 1) 移动到 (2, 2),得分为 14 - 7 = 7 。

7-5 + 14 - 7 = 9,9是总得分。可以发现,计算总得分只需要终点14和起点5,通过14-5就可以得到。那么就说明,这道题就有了个初始的思路,遍历网格每个元素,然后通过某个容器储存这个元素为右下角(终点)的子矩阵中,子矩阵左上角(也就是起点)的最小值是多少。

所以在每次遍历元素的时候,我们定义一个局部变量mn,int mn = min(f[i+1][j],f[i][j+1]);,f[i+1][j+1]的含义是左上角为(0,0),右下角为(i,j)的子矩阵的最小值。因为在我们遍历到某个元素时,他的路径要么从左边来,也就是f[i+1][j],要么从上面来,也就是f[i][j+1],也就是说,当grid[i][j]为终点的时候,要在以(0,0)为左上角,(i,j)为右下角的矩阵中(不包括(i,j))找到最小的那个元素值mn。然后将grid[i][j] - mn的值来更新ans。最后更新f[i+1][j+1],如果grid[i][j]比mn还小的话,那么就其更新为grid[i][j]。

优化:维护列

class Solution {
public:
    int maxScore(vector<vector<int>>& grid) {
        int m = grid.size(), n = grid[0].size();
        vector<int> col_min(n, INT_MAX);
        int ans = INT_MIN;
        for(int i = 0; i < m; i++){
            int pre_min = INT_MAX;
            for(int j = 0; j < n; j++){
                ans = max(ans, grid[i][j] - min(pre_min, col_min[j]));
                col_min[j] = min(col_min[j], grid[i][j]);
                pre_min = min(pre_min, col_min[j]);
            }
        }
        return ans;
    }
};

时间复杂度:O(mn),其中 m 和 n 分别为 mat 的行数和列数。
空间复杂度:O(n)。

整体思路和第一种方法一样,维护列运用到了滚动数组的思路。我们只需要维护列,也就是矩阵每一列的最小值,然后在遍历的过程中,不断更新列的最小值。

首先我们在第一种方法中,在遍历某一格元素时,我们需要的信息是左上角是(0,0),右下角是(i,j)的矩阵的最小元素值。如果用列来表示我们需要的信息,也就是从0到j-1列的最小值,然后第j列的从0到i-1行的最小值,这两个最小值我们进行比较,更小的那个就是我们需要的信息。在代码中表示min(pre_min, col_min[j])

所以说在遍历每一行的时候,我们都要重置pre_min为INT_MAX,pre_min的作用就是找到从0到j-1列的最小值,col_min的作用就是储存第j列的从0到i-1行的最小值。

 ans = max(ans, grid[i][j] - min(pre_min, col_min[j]));

我们可以更新ans的值。

计算完ans后,就要更新pre_min的值为接下来的运算做准备,更新pre_min又需要更新col_min。在更新之前,col_min[j]记载的是第j列的从0到上一行的最小值,更新后就是第j列从0到这一行的最小值。然后知道col_min后,由于pre_min的作用就是找到从0到j-1列的最小值,所以我们pre要更新到第j列,才能供j+1列使用。所以我们只需要比较第j列的最小值有没有比0到j-1列的最小值更小,如果更小的话,那么就更新pre_min的值为该值。

最后遍历完所有元素后,返回ans。

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

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

相关文章

2024年汉字小达人校内选拔的常见问题和解答

广受上海市小学生们关注的2024年第十一届汉字小达人的时间已经确定了&#xff0c;参赛的孩子们已经开始紧锣密鼓的准备中。 如昨天分析的2024年汉字小达人的赛程&#xff0c;即日起到10月20日是学校自行选拔的时间节点。9月25-30日是区级自由报名集中参赛的日子。两个日子有一…

中秋佳节,如何挑选实用有意义的礼物?精选中秋节最佳送礼清单!

当秋风送爽&#xff0c;丹桂飘香&#xff0c;我们即将迎来一年一度的中秋佳节。在这个充满温情与团圆的节日里&#xff0c;赠送礼物成为了表达我们对家人、朋友以及同事的关怀与祝福的重要方式。然而&#xff0c;面对琳琅满目的商品&#xff0c;如何挑选出既实用又有意义的礼物…

《现代食品》是什么级别的期刊?是正规期刊吗?能评职称吗?

​问题解答 问&#xff1a;《现代食品》是不是核心期刊&#xff1f; 答&#xff1a;不是&#xff0c;是知网收录的正规学术期刊。 问&#xff1a;《现代食品》级别&#xff1f; 答&#xff1a;省级。主管单位&#xff1a; 中粮工程科技有限公司 主办单位…

韩国汽车工业的绿色革命:古瑞瓦特光伏逆变器助力能源转型与可持续发展

韩国汽车工业的绿色革命&#xff1a;古瑞瓦特光伏逆变器助力能源转型与可持续发展 汉江奇迹 带来韩国的工业化和现代化 能源的可持续供给 逐步成为韩国工业发展的关键议题为此&#xff0c;韩国颁布了「国家能源基本计划」 推动再生能源发展 预计到2030年新能源电力占总电力的20…

CCS10导入CCS3.3工程

选择工程 下一步 下一步 下一步 下一步 去掉XDAIS 下一步 下一步编译

QT 对话框 仿文本编辑器

对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者简洁的用户交互 一、消息对话框&#xff08;QMessageBox&#xff09; 1、QMessageBox类成员函数实现 1&#xff09;实例化 QMessageBox类 对象 2&#xff09;设置对象属性 3&#x…

【Linux】解锁Shell脚本编写秘籍,编程高手之路等你开启

目录 1. 打印命令行提示符2. 获取用户输入的命令行字符串3. 对命令行字符串进行解析(分割&#xff09;4. 处理内建命令4.1. 内建命令</h3>4.2. 外部命令4.3. cd4.5. export4.6. echo 5. 执行命令5.1. 创建子进程进行程序替换 6. 重定向</h2>7. 总代码 1. 打印命令行…

[000-01-002].第03节:Git基础命令

我的博客大纲 我的GIT学习大纲 1、Git的常用命令 2、Git操作步骤&#xff1a; 2.1.操作Git第一步&#xff1a;设置全局的用户签名 1.设置用户名&#xff1a; 格式&#xff1a;git config --global user.name 用户名命令&#xff1a;git config --global user.name root 2.设置…

【开源免费】基于SpringBoot+Vue.JS在线旅游网站(JAVA毕业设计)

本文项目编号 T 025 &#xff0c;文末自助获取源码 \color{red}{T025&#xff0c;文末自助获取源码} T025&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

【网络安全】漏洞挖掘:文件上传实现Webshell

未经许可,不得转载。 文章目录 正文正文 提交文件功能点,显示只能上传png、jpg、pdf文件 上传一个正常的图片,请求响应如下: 可以看到,该文件被上传到redacted.com,这为后面实现Webshell提供了前提。 接着,我上传webshell.php文件,文件内容为payload,拦截请求包,将…

逆变器的防孤岛测试性能评估

逆变器是太阳能发电系统中的关键设备&#xff0c;它将太阳能电池板产生的直流电转换为交流电&#xff0c;供电网或负载使用。在并网运行的太阳能发电系统中&#xff0c;如果电网出现故障&#xff0c;导致与电网断开连接&#xff0c;但逆变器仍然继续向电网供电&#xff0c;这种…

VBA CSV数据拆分

1. Range.TextToColumns函数 Option ExplicitSub txt2Col()ActiveSheet.Range("A2").CopyActiveSheet.PasteSelection.TextToColumns DataType:xlDelimited, _ConsecutiveDelimiter:True, Comma:True End Sub 2. 效果 执行前 cccccc 执行后效果​ cccc 3. 参照 更…

视频编辑SDK解决方案,代码逻辑结构清晰,接入便捷

美摄科技作为视频编辑技术领域的佼佼者&#xff0c;凭借其深厚的多媒体处理积累和创新精神&#xff0c;推出了革命性的移动端视频编辑SDK解决方案&#xff0c;彻底颠覆了传统视频编辑的方式&#xff0c;让每一份灵感都能轻松转化为引人入胜的视觉盛宴。 一站式视频创作与编辑平…

The First项目报告:BlackCardCoin让数字资产多元化

现有的区块链技术存在吞吐量瓶颈、互操作性有限和次优共识机制等问题&#xff0c;导致效率低下&#xff0c;阻碍了真正全球化金融体系的建立。因此&#xff0c;迫切需要一种创新的区块链&#xff0c;能够容纳现代金融的复杂性&#xff0c;包括即时结算、强大的安全措施&#xf…

用STM32做一个USB-TTL工具吧

某宝1分钱白嫖一个STM32C6T6的板子&#xff0c;然后手里的CH340挂了。那么自己做一个吧。 串口没有使用DMA空闲中断等等机制,有兴趣的加上了call我炒一下。 惯例CUBEMAX配置 1.usb-fs 2.usb-cdc 3.串口开一个中断&#xff0c;使用LL库 贴代码了 usart.c /* USER CODE BEGIN…

电源层 BGA 孔图案对高速信号质量的影响

电源层中的大量间隙孔会对高速信号的行为产生巨大影响。信号完整性对于设计人员来说是一个日益严重的问题&#xff0c;因为新设计需要具有越来越多引脚数的组件&#xff0c;而这些组件必须使用过孔进行连接以访问印刷电路板 (PCB) 的内层。孔和焊盘堆叠的正确设计可以产生高产量…

①MongoDB基本知识①

MongDB属于非关系型数据库一派&#xff0c;没有固定的数据格式存储&#xff0c;是一个具备高性能、高拓展的文档型数据库&#xff0c;数据以BSON(JSON的二进制)的格式存储。 特点: 基于对象模型&#xff0c;关系简单。没有外键的约束&#xff0c;也没有强连接表的关系&#x…

OpengGL教程(三)---使用VAO和VBO方式绘制三角形

本章参考官方教程&#xff1a;learnopengl-cn VertexShader.glsl #version 330 core layout(location 0) in vec3 position; layout(location 1) in vec3 color; uniform mat4 projection; // 投影矩阵 out vec4 ourColor; void main() {gl_Position projection * vec4(p…

信息安全管理工程师

信息安全管理工程师是专门从事信息安全领域的专业人员&#xff0c;主要负责维护计算机系统、网络和数据的安全&#xff0c;以抵御潜在威胁和攻击。 随着信息技术迅猛发展&#xff0c;对此类专业人才的需求持续上升。 如何能够成为一名卓越的信息安全管理工程师呢&#xff1f;…

springboot对数据库进行备份+对一个文件夹内的文件按时间排序,只保留最近的8个文件

首先&#xff0c;对数据库进行备份&#xff0c;用到的命令&#xff1a; mysqldump --opt -h 192.168.1.200 --userroot --passwordxxx --result-fileE://data//20240911141400.sql --default-character-setutf8 xxx&#xff08;数据库名&#xff09; 直接上代码 配置文件部分…